preg_match en preg_replace probleem...

Status
Niet open voor verdere reacties.

decompiler

Gebruiker
Lid geworden
21 nov 2005
Berichten
25
Met behulp van de onderstaande code, loop ik door alle items uit een encyclopedie (eigen woorden, uit eigen database), vergelijk alle woorden met de tekst uit een forum en als er een woord is evonden, dan moet er wat vervangen en toegevoegd worden. echter, in het toegevoegde stuk tekst staat ook een woord in dat dan vervangen gaat worden door de code...
Dit is wat ik dus wil voorkomen.
PHP:
	//-----------------------------------------
	// Encyc Mod
	//-----------------------------------------
		$this->ipsclass->DB->simple_construct( array( 'select' => 'title, text, approved',
													  'from'   => 'ea_encyc_text',
													  'where'  => "approved=1",
											 )		);
		$this->ipsclass->DB->simple_exec();
		while ( $r = $this->ipsclass->DB->fetch_row() )
		{
			$this->ipsclass->cache['encyc_words'][] = $r;
		}
		foreach($this->ipsclass->cache['encyc_words'] as $a_id => $r)
		{
			$keywords   = trim($r['title']);
			$word_array = array();
			$word_array[] = $keywords;
			$endmatch1 = "(\s|,|\.|!|<br|&|$|-|\/)";
			$endmatch2 = "(\<|\s|,|\.|!|<br|&|$|-|\/)";
			if (is_array($word_array))
			{
				foreach ($word_array as $keywords)
				{
					while( preg_match( "/(^|\s|;|-|\()*(\b".preg_quote($keywords, '/')."\b){$endmatch1}(?!\<div id='ea_hover_block-data-)(?!\<\/div>)/i", $row['post'] ) )
					{
						$row['post'] = preg_replace( "/(^|\s|;|\>|-|\()*(".preg_quote($keywords, '/')."){$endmatch2}(?!\<div id='ea_hover_block-data-)(?!\<\/div>)/is", "\\1<a href='#' onmouseover='preview_it({$row['pid']}, event)' onmouseout='preview_hide()' >\\2</a><div id='ea_hover_block-data-{$row['pid']}' style='display:none'>{$r['text']}</div>\\3", $row['post'] );
						echo $row['post'];
					}
				}
			}
		}
	//-----------------------------------------
	// Encyc Mod
	//-----------------------------------------
Als ik deze code loslaat op dit stuk tekst van het forum
Code:
<div class="postcolor" id='post-6423'>
Hallo , ik heb problemen met mijn antivirus van symantec de crack werkt niet meer,nu ben ik dus weer op zoek naar een andere en betere antivirus ,het liefst in het nederlands ,ik heb nu avast er op gezet, misschien iemand een andere optie?<br />
De mcaffee download werkt niet meer. de CrAcK ook niet meer....<br />
B.V.D groet amstel <img src="style_emoticons/HW_smiles/unsure.gif" style="vertical-align:middle" emoid=":unsure:" border="0" alt="unsure.gif" />
</div>
en het woord waar op gezocht moet worden is crack (case insensitive), dan moet mijn bovenstaande code er dit van maken
Code:
<div class="postcolor" id='post-6423'>
Hallo , ik heb problemen met mijn antivirus van symantec de <a href='#' onmouseover='preview_it(6423, event)' onmouseout='preview_hide()' >crack</a><div id='ea_hover_block-data-6423' style='display:none'>hier staat dan een beschrijving wat een crack is</div> werkt niet meer,nu ben ik dus weer op zoek naar een andere en betere antivirus ,het liefst in het nederlands ,ik heb nu avast er op gezet, misschien iemand een andere optie?<br />
De mcaffee download werkt niet meer. de <a href='#' onmouseover='preview_it(6423, event)' onmouseout='preview_hide()' >CrAcK</a><div id='ea_hover_block-data-6423' style='display:none'>hier staat dan een beschrijving wat een crack is</div> ook niet meer....<br />
B.V.D groet amstel <img src="style_emoticons/HW_smiles/unsure.gif" style="vertical-align:middle" emoid=":unsure:" border="0" alt="unsure.gif" />
</div>
maar maakt er dan dit van:
Code:
<div class="postcolor" id='post-6423'>
Hallo , ik heb problemen met mijn antivirus van symantec de <a href='#' onmouseover='preview_it(6423, event)' onmouseout='preview_hide()' >crack</a><div id='ea_hover_block-data-6423' style='display:none'>hier staat dan een beschrijving wat een <a href='#' onmouseover='preview_it(6423, event)' onmouseout='preview_hide()' >crack</a><div id='ea_hover_block-data-6423' style='display:none'>hier staat dan een beschrijving wat een <a href='#' onmouseover='preview_it(6423, event)' onmouseout='preview_hide()' >crack</a><div id='ea_hover_block-data-6423' style='display:none'>hier staat dan een beschrijving wat een <a href='#' onmouseover='preview_it(6423, event)' onmouseout='preview_hide()' >crack</a><div id='ea_hover_block-data-6423' style='display:none'>hier staat dan een beschrijving wat een <a href='#' onmouseover='preview_it(6423, event)' onmouseout='preview_hide()' >crack</a><div id='ea_hover_block-data-6423' style='display:none'>hier staat dan een beschrijving wat een crack is</div> is</div> is</div> is</div> is</div> werkt niet meer,nu ben ik dus weer op zoek naar een andere en betere antivirus ,het liefst in het nederlands ,ik heb nu avast er op gezet, misschien iemand een andere optie?<br />
De mcaffee download werkt niet meer. de <a href='#' onmouseover='preview_it(6423, event)' onmouseout='preview_hide()' >CrAcK</a><div id='ea_hover_block-data-6423' style='display:none'>hier staat dan een beschrijving wat een crack is</div> ook niet meer....<br />
B.V.D groet amstel <img src="style_emoticons/HW_smiles/unsure.gif" style="vertical-align:middle" emoid=":unsure:" border="0" alt="unsure.gif" />
</div>
Heeft iemand een idee wat het probleem kan zijn??
 
Je gebruikt het keyword nogmaals in de beschrijving, dat wordt opnieuw als keyword gezien en genereert weer een beschrijving dat het keyword bevat...

Werkt while( preg_match(... vervangen door if( preg_match(... niet al, de preg_replace vervangt toch alles in 1x (global)?

Of eerst alle keywords vervangen door een code die niet in de tekst voorkomt, als ###keyword, en daarna pas elke ###keyword vervangen door de beschrijving.


Vr.Gr. Egel.
 
Laatst bewerkt:
en dat is dus juist het probleem. ik weet namelijk inmiddels dat je met preg_match en preg_replace een bepaalde code kunt invoeren die NIET mag voorkomen in de tekst. en dat wordt dan ook overgeslagen. mijn vraag is dus hoemoet ik dat aangeven dat er iets tussen 2 tags overgeslagen moet worden...
 
Wat je dus eigenlijk wilt is dat bepaalde woorden in een tekst een uitleg krijgen die je ziet zodra er op dat woord wordt geklikt.

De huidige manier is wat omslachtig, als ik er zo naar kijk..

Stel, je hebt 2 woorden. Koe en melk. De beschrijving van Koe is:
Een koe geeft melk
De beschrijving van melk is
Melk is goed voor elk

Je hebt de volgende tekst:

Een koe is wit

Je gaat door deze tekst heen. Je begint met koe, en daarna met melk. Je tekst ziet er dan uiteindelijk (ongeveer) zo uit:
Een [link:Koe]<uitleg:Een koe geeft [link:melk]<uitleg:Melk is goed voor elk>>

Nu is de vraag, wil je dit ? Lijkt mij niet, want zo kun je een vrij diepe uitleg-'boom' krijgen.

Wat ik zou doen is deze setup:

Je loopt door de tekst heen, maar vervangt het zoals dit:
Mijn beschrijving zie je als je [link:hier]<uitleg:uniekid> klikt
Nu moet je zelf [link:hier] vervangen in jou <a> tag. Tegelijkertijd als je door de tekst loopt, voeg je te toegewezen woorden toe aan een array (dit kun je doen met een uitzondering, zie het e-pattern voor de functie preg_replace ().

Je hebt nu tekst die lijkt op bovenstaande quote. Nu moet je ervoor zorgen dat je het met javascript gaat outputten. Als het op deze manier doet, krijg je geen diepe uitleg-'boom', en behoud je snelheid (voor zover die er al is..).

Nu maak je een javascript array, met de helpteksten. Zodra een user ergens op klikt, moet er aan de hand van een uniek ID (ik weet niet hoe je dat nu hebt gedaan, volgens mij niet goed. Stel je hebt 12 woorden die vervangen zijn in een post (id: 24 bijvoorbeeld), en je laat jou JS functie het woord (de woorden in dit geval) zien dmv. id 24, dan zie je ze alle 12).

Zodra er op een link (het vervangen woord) wordt geklikt, laat je hem een functie uitvoeren die in het <div>-je met betreffende ID de helptekst outputten (kijk naar document.getElementById('helptekstid').innerHTML = 'waarde'; ) en laat hem zien met de nu al gebruikte document.getElementById('helptekstid').style.display code.

Ik hoop dat je er wat van snapt, als ik mijn eigen teksten terug lees snap er ik er nooit 'n klap van :D

Ik werk het nog wel eens uit met code, als het nodig is. Maar probeer het eerst zelf !
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan