Mailinglisten-Archive |
Achim Fink wrote:
> Guten Abend an alle,
>
>
>
> wieder mal das leidige Thema regular expressions.
>
>
>
> Ich habe in einem Text jede menge leerzeichen, möchte aber nur die
> Leerzeichen in einem mit „“ gekennzeichneten Teil ersetzen.
>
>
>
> Zb:
>
> $text= “ das ist ein link: <a href=“das ist der Link“>LINK</a>“;
>
> Soll geben:
>
> $text = “ das ist ein link: <a href=“das_ist_der_Link“>LINK</a>“;
>
>
>
> Ich sitz jetzt schon 2 Stunden vor der regular expression Einführung,
>
> verstehs aber nicht.
>
>
>
> Gruß Achim
>
Das sollte die einfachste Methode sein:
preg_replace('/"([^"]*)"/e','str_replace(" ","_","\\"\\1\\"")',$text);
Du kommst mit sowas nämlich langsam an die Grenzen von Regexen..., aber
mit php geht es noch.
Bitte beachte noch:
Der obige Regex ist KANN eine Sicherheitslücke sein.
Also das heisst, so wie er jetzt da steht ist er glaube ich sicher...
Aber aufgrund des e-Modifiers kann man mit solchen regexen auch schnell
konstrukte bauen, die es einem erlauben beliebigen php-Code auf dem
Server auszuführen.
Kleine Beschreibungsweise der Vorgehensweise noch:
Das regex sucht nach Strings, die mit einem " beginnen, auf dass dann
ganz viele nicht-"s folgen, bis dann ein " folgt. In diesem gefunden
String werden dann alle Leerzeichen durch _ ersetzt.
Die Alternative ist den String mit einer for-Schleife durchzugehen:
$inQuotes =false;
$textneu ='';
for ($i =0; $i<strlen($text); $i++)
{
if (substring($text,$i,1) =='"') $inQuotes =!$inQuotes;
if (($inQuotes) and (substring($text,$i,1) ==' ')) $textneu .='_';
else $textneu .=substring($text,$i,1);
}
Allerdings ist der regex wahrscheinlich hundert mal schneller.
Yannik
php::bar PHP Wiki - Listenarchive