2016-07-08 4 views
2

ich einen regulären Ausdruck, und ich teste es in regepr und regex101diese regex wahr ist, aber in localhost funktioniert nicht

aber es funktioniert nicht in localhost! (Meine Xampp-Version in 7.0.6) mein Code der folgende Code

Html.HTML

{block content 
ddggggggggggggggg 
/endcontent} 

file.php

$pt="~\{\s*block\s*-?\s*(\w+)[\s+|\~](.*)\/end\1}~s"; 
#Blocks# 
preg_match($pt, file_get_contents('html.html'),$match1); 
print_r($match1);exit; 

ich das Problem bin zu raten, ist \ 1, da der folgende Code korrekt funktioniert

$pt="~\{\s*block\s*-?\s*(\w+)[\s+|\~](.*)\/endcontent}~s"; 
#Blocks# 
preg_match($pt, self::$tmp,$match1); 
print_r($match1);exit; 

warum erster Code ist nicht in meinem localhost funktioniert? Wissen Sie, was das Problem ist?

Html.HTML Datei ist nicht statisch und vielleicht diffrent ich eine dynamische regex wie erste Regex benötigen

+0

Benutzen Sie rund um die regex. Ich denke auch, dass Sie ein '()' um '\ s + | \ ~' benötigen, wenn Sie entweder * 1+ whitespaces * oder * a '~' zusammenbringen wollen. Versuchen Sie '$ pt = '~ \ {\ s * block \ s * -? \ S * (\ w +) (\ s + | \ ~) (. *) \/End \ 1} ~ s'; –

+0

vote. .. PERFEKT! Bitte posten Sie Ihre Antwort –

Antwort

2

Sie benötigen einen einzigen wörtlichen zitiert verwenden \1 zu machen als Rückreferenzierung behandelt werden (sonst müssen Sie verdoppeln entkomme es).

Um 1+ oder ~ Whitespaces oder eine Gruppierung mit Klammern, keine Zeichenklasse zu entsprechen. Beachten Sie, dass [\s+|\~] 1 Zeichen entspricht: ein Leerzeichen, ein +, | oder ein ~, und ich bezweifle, dass Sie tatsächlich dieses Verhalten wollen.

Verwenden

$s = "{block content\nddggggggggggggggg\n/endcontent}"; 
$pt='~\{\s*block\s*-?\s*(\w+)(\s+|\~)(.*)\/end\1}~s'; 
preg_match($pt, $s, $match1); 
print_r($match1); 

anzeigen IDEONE demo

+1

dankbar! Du hast mir schon geholfen –

Verwandte Themen