$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);
为什么输出是:
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) "{"
}
在我看来,^([\S\s]+)
可以匹配整个字符串..
答案 0 :(得分:1)
原因是组12(^(\{)
)匹配成功,因此正则表达式引擎停止。它甚至从未尝试匹配第16组(^([\S\s]+)
)。
如果您将第16组放在第12组之前,那么它将匹配整个字符串。但是,由于[\s\S]
完全匹配任何字符(并且在使用.
修饰符时可以缩写为s
),因此其他任何组都不匹配。
总而言之,你的正则表达式看起来很奇怪。如果除了明显的疣之外还有一些错误,比如试图将几个空格放入单个角色类中,我不会感到惊讶。