phpbar.de logo

Mailinglisten-Archive

[php] Zwischen zwei Zeichen finden

[php] Zwischen zwei Zeichen finden

Yannik Hampe yannikh at gmail.com
Die Sep 26 22:42:10 CEST 2006


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