preg_match_全部不在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);

我试图匹配字符串中以竖线“|”开头和结尾的所有行。我尝试了不同的模式,并使用在线测试仪成功地测试了模式“/^\|.*\|$/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) {
}

这意味着该模式未找到任何匹配项。它快把我逼疯了。我做错了什么?

使用这个正则表达式应该可以

$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|
)