preg_match_all无法在php中工作,但已在在线正则表达式测试器中成功测试

时间:2018-05-14 20:18:47

标签: php regex preg-match-all

我正在尝试匹配字符串中以竖线“|”开头和结尾的所有行。我尝试了不同的模式,并使用在线测试器https://regex101.com/成功测试了模式'/^\|.*\|$/m'。

然而,当我将相同的成功测试模式放入我的PHP脚本时,它不起作用。这是一个示例代码:

$re = '/^\|.*\|$/m';
$str = 'Why is this not working?

|Test|
|Test|
|Test|
|Test|
';

preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);
var_dump($matches);

此代码输出

array(0) {
}

这意味着该模式没有找到任何匹配。这让我发疯了。我做错了什么?

2 个答案:

答案 0 :(得分:3)

这个正则表达式应该可行

$re = '/^\|.*\|\r$/m';

http://sandbox.onlinephpfunctions.com/code/44c7d929742a58ca81f9e7ffad4587d9a4854b15

答案 1 :(得分:2)

您可以告诉PCRE引擎在使用(*ANY) PCRE动词的任何垂直空白字符之前匹配行尾:

$re = '/(*ANY)^\|.*\|$/m';

请参阅PCRE docs

  

PCRE_NEWLINE_ANY指定应识别任何Unicode换行序列。

请注意,对于大多数情况,(*ANYCRLF)就足够了,因为它会使.匹配任何字符,但CR和LF和$将在其中一个字符之前匹配。< / p>

请参阅PHP demo

$re = '/(*ANY)^\|.*\|$/m';
$str = "Why is this not working?\r\n\r\n|Test|\r\n|Test|\r\n|Test|\r\n|Test|\r\n";
preg_match_all($re, $str, $matches);
print_r($matches[0]);

输出:

Array
(
    [0] => |Test|
    [1] => |Test|
    [2] => |Test|
    [3] => |Test|
)