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