【发布时间】: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 寻找线索,但一无所获。
任何和所有的帮助表示赞赏。谢谢!
【问题讨论】:
-
无法重现 - 3v4l.org/g39nA 也许您应该检查输入数据实际包含的字符/字节序列,它似乎与您想象的不同。
-
好的,如果换行符实际上不仅仅是
\n,而是\r\n,可以重现。 -
这似乎是一个很好的线索@CBroe。感谢分享。我可以在这里使用您相同的 sn-p 进行复制:http://sandbox.onlinephpfunctions.com/code/34fda19b70b2e32b89224dceb08d704c8ce065f2