如何理解下面的PHP正则表达式匹配的输出?

时间:2010-12-29 07:24:09

标签: php regex pattern-matching

$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]+)可以匹配整个字符串..

1 个答案:

答案 0 :(得分:1)

原因是组12(^(\{))匹配成功,因此正则表达式引擎停止。它甚至从未尝试匹配第16组(^([\S\s]+))。

如果您将第16组放在第12组之前,那么它将匹配整个字符串。但是,由于[\s\S]完全匹配任何字符(并且在使用.修饰符时可以缩写为s),因此其他任何组都不匹配。

总而言之,你的正则表达式看起来很奇怪。如果除了明显的疣之外还有一些错误,比如试图将几个空格放入单个角色类中,我不会感到惊讶。