2010-12-29 4 views
0
$file = '{include file="{$COMMON_TPL_PATH}common/header_admin.tpl"} 
{include file="{$mainPage}"} 
{include file="{$COMMON_TPL_PATH}common/footer_admin.tpl"}'; 
preg_match('/^(\{\})|^(\{\*([\S\s]*?)\*\})|^(<\?(?:php\w+|=|[a-zA-Z]+)?)|^([  ]*[ 
]+[ ]*)|^(\{strip\})|^(\{\/strip\})|^(\{literal\})|^(\{\s{1,}\/)|^(\{\s{1,})|^(\{\/)|^(\{)|^(([\S\s]*?)(?=([ ]*[ 
]+[ ]*|\{|<\?)))|^([\S\s]+)/', $file, $matches); 
var_dump($matches); 

Warum ist die Ausgabe:Wie verstehst du die Ausgabe der PHP Regex, die unten passt?

array(13) { 
    [0]=> 
    string(1) "{" 
    [1]=> 
    string(0) "" 
    [2]=> 
    string(0) "" 
    [3]=> 
    string(0) "" 
    [4]=> 
    string(0) "" 
    [5]=> 
    string(0) "" 
    [6]=> 
    string(0) "" 
    [7]=> 
    string(0) "" 
    [8]=> 
    string(0) "" 
    [9]=> 
    string(0) "" 
    [10]=> 
    string(0) "" 
    [11]=> 
    string(0) "" 
    [12]=> 
    string(1) "{" 
} 

Es scheint mir, dass ^([\S\s]+) die gesamte Zeichenfolge übereinstimmen können ..

+0

Sie haben Recht mit '[\ s \ S]'. Siehe http://stackoverflow.com/questions/4544636/what-does-ss-mean-in-regex-in-php – codaddict

Antwort

1

Der Grund dafür ist, dass Gruppe 12 (^(\{)) erfolgreich übereinstimmt und somit die regex Motor stoppt. Es kann nicht einmal versuchen, Gruppe 16 (^([\S\s]+)) zu entsprechen.

Wenn Sie Gruppe 16 vor Gruppe 12 setzen, wird die gesamte Zeichenfolge übereinstimmen. Da [\s\S] jedoch mit einem beliebigen Zeichen übereinstimmt (und bei Verwendung des Modifikators s mit . abgekürzt werden kann), wird keine der anderen Gruppen jemals übereinstimmen.

Alles in allem sieht Ihre Regex ziemlich seltsam aus. Ich wäre nicht überrascht, wenn es neben den offensichtlichen Warzen ein paar Käfer gäbe, wie den Versuch, mehrere Räume in eine einzelne Charakterklasse zu bringen.

+0

BTW, was bedeutet '(? =' In der obigen Regex? – smarty

+0

'(? = (...) 'ist ein positiver Lookahead. Es behauptet, dass es möglich ist, seinen Inhalt an der aktuellen Position abzugleichen, ohne diese Zeichen tatsächlich zur Übereinstimmung hinzuzufügen. Also wird' foo (? = bar) '' foo' nur dann entsprechen wird gefolgt von 'bar'. –