preg_replace mit Variable als Pattern
TomTom
- php
Hallo!
Ich möchte einen $text durchlaufen und automatisch mit Links versehen.
Ich habe es mit str_replace hingekriegt, allerdings soll die Suche case insensitive sein und das geht mit str_replace leider nicht.
Und PHP 5 habe ich nicht, um str_ireplace benutzen zu können.
Also schien mir preg_replace die richtige Funktion zu sein. Ich finde irgendwie nichts darüber, ob und wie man eine Variable als Pattern benutzen kann. Ich habe schon dutzend Dinge probiert, aber kriege es einfach nicht hin. Hilfe. :-(
Hier zur Veranschaulichung.
$abfrage = mysql_query( "SELECT begriff, url FROM links" );
while ( $link = mysql_fetch_array( $abfrage ) )
{
$text = preg_replace($link[begriff], "<a href='$link[url]'>$link[begriff]</a>", $text);
}
Wie muss also das Pattern lauten, wenn es nach $link[begriff] case insensitive suchen soll.
'/$link[begriff]/i' oder '/($link[begriff])/i' tut es nicht und das ist das einzig logische, was ich fabrizieren kann.
hi,
'/$link[begriff]/i' oder '/($link[begriff])/i' tut es nicht
http://www.php.net/manual/de/language.types.string.php#language.types.string.parsing
gruß,
wahsaga
hi,
'/$link[begriff]/i' oder '/($link[begriff])/i' tut es nicht
http://www.php.net/manual/de/language.types.string.php#language.types.string.parsing
Doppelte Anführungsstriche "/$link[begriff]/i" tun es auch nicht, wenn es das ist, was du mir sagen willst.
Da kommt dann "Warning: Unknown modifier '0'" in der Zeile von preg_replace.
Ein paar Stunden später habe ich jetzt das zusammenbekommen.
$pattern = "~$link[begriff]~i";
$text = preg_replace($pattern, "<a href='$link[url]'>$link[begriff]</a>", $text);
Ich verstehe zwar nicht warum, aber es scheint zu funktionieren. Juhu!
moin,
$pattern = "~$link[begriff]~i"; Ich verstehe zwar nicht warum, aber es scheint zu funktionieren.
ein regular expression braucht <delimiter> - die teile, die aussen gleich sein müssen. dieser delimiter darf im pattern nicht, oder nur escaped (mit '') vorkommen.
jetzt musst du ja dein pattern so betrachten, dass der inhalt der variable drin steht. wenn dann in deinem link ein '/' vorkomt (wahrscheinlich) und du aber auch '/' als delimiter nimmst, geht das schief.
andreas
moin,
$pattern = "~$link[begriff]~i";
Ich verstehe zwar nicht warum, aber es scheint zu funktionieren.ein regular expression braucht <delimiter> - die teile, die aussen gleich sein müssen. dieser delimiter darf im pattern nicht, oder nur escaped (mit '') vorkommen.
jetzt musst du ja dein pattern so betrachten, dass der inhalt der variable drin steht. wenn dann in deinem link ein '/' vorkomt (wahrscheinlich) und du aber auch '/' als delimiter nimmst, geht das schief.
andreas
Hallo Andreas.
Danke für deine Erklärung. Das Problem ist nur, der $link[begriff] ist immer nur ein Wort und es kommen keinerlei Sonderzeichen vor, also auch kein '/'. Es war ein Zufall, dass ich die Tilde als Delimeter probierte, aber mit bspw. '/' oder '#' funktionierte es nicht und ich verstehe beim besten Willen nicht warum.
Und warum ich "~$link[begriff]~i"; nicht einfach direkt als Pattern ins preg_replace(); schreiben kann, sondern erst in eine Variable schreiben muss, ist mir auch schleierhaft.
Aber aus Regular Expressions wurde und werde ich nie schlau.
Gruß,
Tom