PHP正则表达式:跨多行搜索

3

我正在使用 PHP 中的 preg_* 函数来搜索模式 <!-- %{data=THIS GETS MATCHED}% --> 并提取匹配的文本。

该模式为:

preg_match('#<!-- %{' . $knownString . '\s*=\s*(.*?)}% -->#', ...)

我希望它可以在多行中搜索字符串。例如:
<!-- %{data=
THIS GETS
MATCHED AND
RETURNED
}% -->

如何修改当前模式以实现搜索功能?
3个回答

6
你需要添加 "s" 模式修饰符,否则点号会匹配除换行符之外的任何字符:
preg_match('#<!-- %{' . $knownString . '\s*=\s*(.*?)}% -->#s', ...)

1
在将$knownString与其余正则表达式拼接在一起之前,我会使用preg_quote()来保护它。 - Kamil Szot

1

这似乎有效:

<?php
    $testString = "<!-- %{data=
THIS GETS
MATCHED AND
RETURNED
}% -->";
    $knownString = "data";
    preg_match( "@<!-- %\\{" . $knownString . "\\s*=\\s*([^\\}]+)\\}% -->@", $testString, $match );
    var_dump( $match );
?>

返回:

array(2) {
  [0]=>
  string(54) "<!-- %{data=
THIS GETS
MATCHED AND
RETURNED
}% -->"
  [1]=>
  string(34) "THIS GETS
MATCHED AND
RETURNED
"
}

m,或多行模式,改变了 ^$ 锚点的含义,使它们能够在行边界上匹配,而不仅仅是在字符串的开头和结尾。你的正则表达式之所以有效,是因为你将点号改为了 ([^\\}]m 是无关紧要的。 - Alan Moore

1

preg_match('#<!-- %{' . $knownString . '\s*=\s*(.*?)}% -->#s', ...) 这段代码能用吗?

我现在工作的地方没有 PHP,所以无法测试它...


我使用/<!-- %{' . $knownString . '=\s*(.*?)}% -->/s让它起作用。然而,我很糟糕的正则表达式,所以如果你看到它想着“...哈哈?”。请告诉我 xD - dave

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接