2016-05-26 12 views
2

ich ein preg_match_all Funktionen mit Muster haben:relativ einfache preg_match_all verursacht 502 Bad Gateway

preg_match_all(
    '/\[(if) ([^\]]*)\] 
    ((?:(?!\[if).|(?R))*?) 
    \[endif\]/sx', 
    $text, 
    $matches 
); 

Es ist ganz einfach Muster Ich denke, es sieht für eine Syntax [if condition] sometext [endif], aber es unterstützt auch einbetten ifs F. E. [if condition1] aa [if condition2] bb [endif] [endif]. Ich habe s Schalter verwendet, um Zeilenumbrüche als Punkte zu behandeln (da ich möchte, dass es mehrzeilig funktioniert) und x zum leichteren Lesen (aber das Entfernen von x behebt das Problem nicht).

Es funktioniert gut für die meisten Eingabedaten, die ich habe, aber für einige spezifische Eingabe verursacht 502 Bad Gateway Fehler auf Nginx-Server ohne Fehler oder Ausnahmen in Protokollen, die. Ich benutze nginx + php-fpm (5.6.15-1 + deb.sury.org ~ trusty + 1), aber das gleiche passiert auf php7.

Hier wird verursacht 502 Bad Gateway-Fehler PHP-Code, den Sie leicht überprüfen können, sehr einfach, nur eine Variable und Regex.

http://pastebin.com/G54Xa0as

Bitte, sicher sein, dass Sie einen Inhalt 1: 1 kopiert, mit allen Leerzeichen, Tabulatoren usw.

Die sehr seltsam ist, dass man fast jede einzelne Zeile entfernen oder sogar eine löschen Einrückung (beliebige wenige Leerzeichen an einem beliebigen Ort), damit es funktioniert.

Ich habe keine Ideen mehr, was hier falsch ist, konnte ich diese einzelne Datei erstellen, um mein Problem zu demonstrieren, aber habe keine Ideen, wie es zu beheben.

+0

Ich kann es nicht auf eval.in reproduzieren: https://eval.in/577522 – jeroen

+0

@jeroen Recht, überraschend, es funktioniert gut mit PHP, nur überprüft, läuft mit 'php test.php' und es funktioniert wie erwartet. Das Problem tritt nur auf, wenn die Datei über nginx mit php-fpm (nginx/1.8.0) geöffnet wird. – atay

+1

Versuchen Sie ['\ [(if) \ s + ([^ \]] * +) \] ((?> ?! \ [(?: end)? if \ b). | (? R)) *) \ [endif \] '] (https://regex101.com/r/xA3iC8/1) oder sogar [' \ [(if) \ s + ([^ \]] * +) \] ((?> [^ [] ++ (?: \ [(?! (?: Ende)? if \ b) [^ [] *) * | (? R)) *) \ [endif \] '] (https://regex101.com/r/xA3iC8/2). –

Antwort

2

Ihr Regex enthält einen negativen Lookahead, der das Punktmuster "temperiert". Es ist Ihnen jedoch nicht gelungen, das Endbegrenzungszeichen hinzuzufügen, und daher wurde es eher "schwer".

Ich schlage vor Hinzufügen des Endebegrenzers ([endif]) mit dem Look-Ahead-Check:

\[(if)\s+([^\]]*+)\]((?>(?!\[(?:end)?if\b).|(?R))*)\[endif\] 
          ^^^^^^^^ 

Siehe demo

Oder Sie können sogar die temperierte gierig Token als

\[(if)\s+([^\]]*+)\]((?>[^[]++(?:\[(?!(?:end)?if\b)[^[]*)*|(?R))*)\[endif\] 

See entrollen the regex demo (wenn jedoch ein [[if...] folgen kann, wird es nicht funktionieren).

Auch Notiz, dass Ihre Regex einen Raum nach (if) hat und da Sie /x Modifikator verwenden, wird es nicht als wörtliche Raum betrachtet, aber ignoriert. Deshalb habe ich es in \s+ geändert.

Verwandte Themen