phpbar.de logo

Mailinglisten-Archive

[php] Regex funktioniert nach PHP Versionsumstellung nicht mehr

[php] Regex funktioniert nach PHP Versionsumstellung nicht mehr

yankee yannikh at gmail.com
Fre Sep 22 21:42:30 CEST 2006



Niels Runge wrote:
>>>>> If
>>>>> (preg_match("'\[(center|left|right)\](.*?|(.*?\n*?.*?)*)\[(/center|/left|/ri
>>>>> ght)\]'", $content))
>>>>>     
>>>>>         
>>>> Schnell-guess:
>>>> Alle Backslashes müssen doppelt sein, da sie in einem String sind... \n 
>>>> ist sonst zum Beispiel ein Zeilenumbruch...
>>>>
>>>>   
>>>>       
>>> dann wäre hiermit wohl geholfen
>>> http://php.net/preg_quote
>>>     
>> Nein... Denn das problem besteht schon, bevor du den Text durch diese 
>> Funktion jagen könntest...
>> Denn "\n" enterpretiert der php-Parser sofort als Zeilenumbruch und 
>> nicht als \n.
>>   
> hmm, vielleicht meinst Du etwas anderes aber ansonsten ist folgendes 
> doch kein Problem
> 
> list($str_mit_nl) = $db->query('SELCT foo as "0" FROM bar");
> // foo enthält dann einen Text der Zeilenumbrüche enthält
> 
> $str_mit_doppel_nl = str_replace("\n", "\n\n", $str_mit_nl);
> 
> Es ist spät, vielleicht stehe ich auch auf dem Schlauch oder Du meinst 
> etwas anderes ;-)
ähm ja...
Also ich hol' mal gaaaaannz weit aus, damit wiklich kalr ist, was ich meine:
Also ein String besteht ja eigentlich ein array mit Zahlen, die die 
Buchstaben representieren...
Und es gibt eben auch eine Zahl für Zeilenumbrüche:
http://www.lookuptables.com/
Also Nummer 10.
(bzw. Windows verwendet sogar 10 und dann noch 13 (voll unnötig *gg*).
Wenn php jetzt einen String parst:
"abc\ndef"
Dann achtet der php-Parser beim parsen auf backslashes (\). Wenn das 
Zeichen nach dem Backslash ein 'n' ist, ersetzt php Das \n durch ein 
neue-Zeilezeichen (10)).
\t wird dabei übrigens auch noch durch Tab ersetzt.
Und \\ wird durch \ ersetzt.
Also
print("ab\ncd");
gibt
ab
cd
aus und nicht
ab\ncd
Und print("ab\\ncd");
gibt
ab\ncd
aus.
Also muss dein regexaufruf so aussehen:
"'\\[(center|left|right)\\](.*?|(.*?\\n*?.*?)*)\\[(/center|/left|/right)\\]'"

So. Ich hoffe wir haben jetzt nicht total aneinander vorbeigeredet und 
du hast mir das gleich um die Ohren *gg*.
Ich kann mir nämlich auch das \n in deinem String nicht ganz erklären. 
Wenn du willst, dass in dem text auch Zeilenumbrüche vorkommen dürfen 
(was sehr wahrscheinlichj ist, solltest s-Modifiere benutzen. Dann sieht 
dein regex so aus:
"'\\[(center|left|right)\\](.*?|(.*?)*)\\[(/center|/left|/right)\\]'s"
Wobei ich den regex auch so noch nicht ganz verstanden habe... 
Eigentlich sollte das schon reichen:
"'\\[(center|left|right)\\](.*?)\\[(/center|/left|/right)\\]'s"


> 
> Gruß
> Niels

php::bar PHP Wiki   -   Listenarchive