Problem mit preg_match

PhoenixDH

Erfahrenes Mitglied
Kompletter String mit preg_match

Ich habe ein Problem mit der preg_match Funktion. Und zwar habe ich eine Datenbank, in der Abkürzungen und die dazugehörigen Beschreibungen gepseichert sind.

Wenn jetzt in meinem Forum jemand einen Post macht, soll überprüft werden ob die Abkürzung in dem Text uns soll durch ein Acronym-Tag ersetzt werden. Das funktioniert auch soweit, nur kann es ja vorkommen, das es mehrere Abkürzungen gibt die fast gleich sind, a er andere Beschreibungen haben.

Das wäre z.B. bei mir der Fall bei

ESD, eSD und SD !

Jetzt habe ich das Probiert, dier ersetzungen macht er immer, also wenn z.B. eSD vorkommt, ersetzt er erst das eSD danch aber nochmal das SD, das soll nicht sein !

Wie kann ich das bei der Funktion ändern ?

Code:
function check_synonyms($text)
{

	global $pref;
	
	$r_synonym = thwb_query("SELECT syn, syn_description FROM $pref"."synonyms ORDER BY syn ASC");
	if( mysql_num_rows($r_synonym) != 0 )
	{
		while( $synonym = mysql_fetch_array($r_synonym) )
		{
			//if ( strstr($text, $synonym[syn] ) )
			if (preg_match("/$synonym[syn]/",$text)) 
			{
			$desc = "[acronym=\"".$synonym[syn]."\"]".$synonym[syn_description]."[/acronym]";
			$text = str_replace($synonym[syn], $desc, $text);
			}
		}
	}

	return $text;
}

Es soll also immer das komplette Wort verglichen werden, inklusiver der Rechtschreibung groß klein !
 
Zuletzt bearbeitet:
Re: Kompletter String mit preg_match

z.B. so:
Code:
if (preg_match("/\b$synonym[syn]\b/",$text))

\b steht für Wortgrenze.
In deinem Fall bedeutet es, dass davor/danach kein Buchstabe stehen darf.
 
Du musst beim Ersetzen natrürlich auch mit RegExp arbeiten:
Code:
//alt
$text = str_replace($synonym[syn], $desc, $text);
//neu
$text = preg_replace("/\b$synonym[syn]\b/", $desc, $text);
 
Hab das jetzt so eingebaut:
Code:
function check_synonyms($text)
{

	global $pref;
	
	$r_synonym = thwb_query("SELECT syn, syn_description FROM $pref"."synonyms ORDER BY syn ASC");
	if( mysql_num_rows($r_synonym) != 0 )
	{
		while( $synonym = mysql_fetch_array($r_synonym) )
		{
			if (preg_match("/\b$synonym[syn]\b/",$text)) 
			{
			$desc = "[acronym=\"".$synonym[syn]."\"]".$synonym[syn_description]."[/acronym]";
			$text = preg_replace("/\b$synonym[syn]\b/", $desc, $text);
			}
		}
	}

	return $text;
}

Das mit den Unterschieden wie eSD, ESD und SD funktioniert, aber leider wird jetzt noch zusätzlich nach jedem Wort ein leeres Acronym Tag eingeführt, sieht so aus:
Code:
[acronym=""][/acronym]Ich[acronym=""][/acronym] [acronym=""][/acronym]bin[acronym=""][/acronym] [acronym=""][/acronym]eine[acronym=""][/acronym] [acronym=""][/acronym]eSD[acronym=""][/acronym], [acronym=""][/acronym]ESD[acronym=""][/acronym], [acronym=""][/acronym]SD[acronym=""][/acronym] ! [acronym=""][/acronym]oder[acronym=""][/acronym] [acronym=""][/acronym]ABS[acronym=""][/acronym] [acronym=""][/acronym]oder[acronym=""][/acronym] [acronym=""][/acronym]LuFi[acronym=""][/acronym] [acronym=""][/acronym]Oder[acronym=""][/acronym] [acronym=""][/acronym]auch[acronym=""][/acronym] [acronym=""][/acronym]ein[acronym=""][/acronym] [acronym=""][/acronym]trhrthtrhtrzverfldg[acronym=""][/acronym]

Woran liegt das jetzt plötzlich ?
 
Achso, verstehe, dann fügt der für jedes das auch net dabei ist ein leeres ein oder was ?

Müsste ich dan mysql_fetch_row verwenden ?
 
Vergiss, was ich gesagt habe(mit dem Array)... war Quatsch :-)

Setze mal $synonym[syn] innerhalb von preg_match in geschweifte Klammern.
 
Zurück