我正在尝试匹配字符串中以竖线“|”开头和结尾的所有行。我尝试了不同的模式,并使用在线测试器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) {
}
这意味着该模式没有找到任何匹配。这让我发疯了。我做错了什么?
答案 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|
)