Mailinglisten-Archive |
Tach Lars,
Lars Kroll wrote:
> Ich möchte in einem String $text alle Begriffe $begriff durch $ersetzung ersetzen lassen.
> Bis auf die Begriffe, welche in Image-Tags (<img...$begriff...>) eingeschlossen sind.
> Habe verschiedenes mit preg_replace () versucht. Hat aber alles nix geholfen.
Ich habe bis heute keinen praktikablen Weg gefunden eine komplette,
feste Zeichenkette auszuschliessen.
Einzelne Zeichen sind kein Problem, ganze Zeichenklassen auch nicht aber
eine Zeichenfolge innerhalb einer anderen Zeichenfolge zu negieren ist
mir selbst nach zweifachem Durchlesen von Jeffrey Friedl's RegEx Bibel
nicht gelungen.
Ich könnte dir höchstens eine etwas umständliche Lösung anbieten:
// zuerst alle <img ... > Tags in $text raussuchen
if (preg_match_all('/<img([^>]*)+>/u',$text,$matches,PREG_SET_ORDER)
{
foreach ($matches AS $key=>$match)
{
// eine eigene Zeichenkette bauen, die man wiederfinden kann
$replace = "##REPLACE_".$key."##";
// und den gefundenen <img> Tag dadurch ersetzen
$text = str_replace($match[0],$replace,$text);
}
// im übriggebliebenen Text $begriff durch $ersetzung ersetzen
$text = str_replace($begriff,$ersetzung,$text);
// nachdem die ersetzung fertig ist werden die vorher gefundenen und
// !unbehandelten! <img> Tags wieder in den Text eingesetzt
foreach ($matches AS $key=>$match)
{
$text = str_replace("##REPLACE_".$key."##",$match[0],$text);
}
}
Es ist wie gesagt etwas umständlich, ist (bis auf die RegEx) ungetestet
und je nachdem wieviele <img> Tags du hast vielleicht etwas langsam,
aber wenn sich jemand findet, der mir zeigt wie man Zeichenketten in
Zeichenketten negiert lebe er hoch. ;-)
<rauskitzel>
Wahrscheinlich kann man damit aber eher auf einer Perl Liste rechnen hehe...
</rauskitzel>
grüße
henning
php::bar PHP Wiki - Listenarchive