preg_match_全部不在php中工作,但已在在线正则表达式测试仪中成功测试
我试图匹配字符串中以竖线“|”开头和结尾的所有行。我尝试了不同的模式,并使用在线测试仪成功地测试了模式“/^\|.*\|$/m” 然而,当我将相同的成功测试模式放入我的php脚本时,它不起作用。这是一个示例代码:preg_match_全部不在php中工作,但已在在线正则表达式测试仪中成功测试,php,regex,preg-match-all,Php,Regex,Preg Match All,我试图匹配字符串中以竖线“|”开头和结尾的所有行。我尝试了不同的模式,并使用在线测试仪成功地测试了模式“/^\|.*\|$/m” 然而,当我将相同的成功测试模式放入我的php脚本时,它不起作用。这是一个示例代码: $re = '/^\|.*\|$/m'; $str = 'Why is this not working? |Test| |Test| |Test| |Test| '; preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);
$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) {
}
这意味着该模式未找到任何匹配项。它快把我逼疯了。我做错了什么?使用这个正则表达式应该可以
$re = '/^\|.*\|\r$/m';
您可以使用
(*any)
PCRE动词告诉PCRE引擎匹配任何垂直空白字符之前的行尾:
$re = '/(*ANY)^\|.*\|$/m';
见:
PCRE\u NEWLINE\u ANY
指定应识别任何Unicode换行符序列
请注意,在大多数情况下,(*ANYCRLF)
就足够了,因为它将启用
匹配任何字符,但CR和LF和$
将在任何字符之前匹配
见:
输出:
Array
(
[0] => |Test|
[1] => |Test|
[2] => |Test|
[3] => |Test|
)
当我复制并超过您的示例代码时,它工作得很好。你也可以看到它。我认为您的PHP安装有问题,或者您的示例中存在无法复制和粘贴的不可见字符。它在本网站上也不起作用。。包含回车符
\r?$
使用'/(*ANYCRLF)^\\\\\\\\\$/m'
不值得回答@WiktorStribiżew?看起来不错,因为比赛中不包括回车,是吗?我从未在野外见过(*任何)。它有什么问题@sln?那么/^\\|.*(?=\R)$/um
?@wp78de呢,因为$
只在\n
之前匹配,并且在
和\n
之间存在\R
(因此向前看没有帮助)。(*ANY)
动词没有问题,因为它有助于覆盖换行标志PCRE是用@wp78de-几乎/^\\\\\\.\\\\\\\\\\\\\\\\\\\\\\\\\\.(?-m:(?=\R\$)/um
编译的,但是,这可能是他们使用PCRE时的一个Php怪癖。就像这里的示例一样,它似乎有CRLF结尾,但仍能正常工作。@sln regex101始终使用LF结尾。您不能在那里测试CRLF结尾。@WiktorStribiżew-显然,因为\r
不匹配。它看起来像一个蹩脚的网站,试图从示例alaperl中自动剥离CR。令人惊讶的是,Boost将(?m)$
视为(?:\r?\n |\r)
或(?:\r?\n |\r)
。如果愿意,我不会试图为这个惊人的错误为PCRE或Php辩护。而且,对于以前删除过我评论的人,吃一片药,冷静下来。你并没有帮助解决regex引擎的问题。
Array
(
[0] => |Test|
[1] => |Test|
[2] => |Test|
[3] => |Test|
)