【问题标题】:Where is this mysterious line break coming from when matching PHP regex in multiline mode? [duplicate]在多行模式下匹配 PHP 正则表达式时,这个神秘的换行符来自哪里? [复制]
【发布时间】:2021-09-21 15:49:50
【问题描述】:

我正在编写一个正则表达式来解析降价警告。这是我的测试数据:

!!! hello
This is a test
with multiple lines
!!!

但是,我的代码似乎没有捕获“hello”,而是捕获了“hello\r\n”,而我终其一生都无法弄清楚为什么。

这里有一些简化的 PHP 代码展示了我遇到的问题:

preg_replace('/^!!! (.*)/m', '|$1|', $content);

这将测试数据的第一行替换为:

|hello
|

第二个管道在下一行的位置。

当我像这样修改这个正则表达式时:

preg_replace('/^!!! ([a-z]*)/m', '|$1|', $content);

然后我得到第一行的预期输出:

|hello|

在多行模式下,.字符不应该与换行符匹配 - 那么在我使用点的捕获组中换行符来自哪里?

我尝试过的其他一些事情:

preg_replace('/^!!! (.*o)/m', '|$1|', $content);

按预期工作。

preg_replace('/^!!! (.*)$/m', '|$1|', $content);

仍然包含换行符,尽管我认为 $ 应该在换行符之前匹配。

我数小时以来一直试图弄清楚这一点,但显然遗漏了一些东西(可能很明显)。我还搜索了互联网和 stackoverflow 寻找线索,但一无所获。

任何和所有的帮助表示赞赏。谢谢!

【问题讨论】:

标签: php regex


【解决方案1】:

@CBroe 给了我解开这个谜团的钥匙。在手头出现行尾异常的情况下,我发现了以下 stackoverflow 线程:How to change what PCRE regexp thinks are newlines in multi-line mode?。这导致了以下正则表达式,它对我有用:/(*ANYCRLF)^!!! (.*)/m

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-22
    • 2019-11-01
    • 1970-01-01
    相关资源
    最近更新 更多