传递给preg_match_all的模式中的破折号/ dolar奇怪地使模式不匹配

时间:2013-10-16 20:11:29

标签: regex preg-match preg-match-all

我的正则表达式有问题。我试图匹配包含单词“RewriteBase”的文件中的所有行与可能的空格。示例文件是:

    #RewriteBase /yardley/development
    RewriteBase /yardley/

我的模式及其结果:

@RewriteBase\s*(.*)@ //matches both lines - OK
@RewriteBase\s*(.*)$@ //matches first line only - why?
@^.*RewriteBase\s*(.*)@ //doesn't match any - why? It should accept all characters before "RewriteBase"

我完全坚持下去了。非常感谢

1 个答案:

答案 0 :(得分:1)

由于您使用的是行开始锚点^或行尾锚点$,因此第二个正则表达式只匹配第二行,第三个正则表达式只匹配第一行。

您可以使用多行(m)开关来匹配3个正则表达式中的所有行:

$s = <<< EOF
#RewriteBase /yardley/development
RewriteBase /yardley/
EOF;
if (preg_match_all('@RewriteBase\s*(.*)$@m', $s, $arr))
   var_dump($arr[0]);

<强>输出:

array(2) {
  [0]=>
  string(32) "RewriteBase /yardley/development"
  [1]=>
  string(21) "RewriteBase /yardley/"
}