【发布时间】:2010-10-26 17:26:11
【问题描述】:
php 正则表达式中的. 字符接受除换行符以外的所有字符。我可以使用什么来接受所有字符,包括换行符?
【问题讨论】:
php 正则表达式中的. 字符接受除换行符以外的所有字符。我可以使用什么来接受所有字符,包括换行符?
【问题讨论】:
这通常用于捕获所有字符:
[\s\S]
您可以以同样的方式使用“Type-X + Non-Type-X”的任何其他组合:
[\d\D]
[\w\W]
但[\s\S] 按照惯例被认为是“真的任何东西”的简写。
如果您通过"s" 修饰符将正则表达式切换到“dotall”(也称为“单行”)模式,您也可以使用.。有时这不是一个可行的解决方案(例如,黑盒中的动态正则表达式,或者如果您不想修改 整个 正则表达式)。在这种情况下,无论正则表达式如何配置,其他替代方案都会这样做。
【讨论】:
. 字符表示“每个字符”(edit:OP 已编辑)。您需要将选项 s 添加到您的正则表达式中,例如:
preg_match("`(.+)`s", "\n");
【讨论】:
m 也是一个选项。但基于 OP,s 是要走的路。
s(也许还有m)才能真正完成。
会
[.\n]+
不工作?
(.|\n)+ 怎么样?我测试了它,它似乎可以工作。
我很确定这正是您所要求的字面解释。
【讨论】:
. 并不意味着“任何字符”。它的意思是“一个点”。字符类有自己的语法。 ;-)
[this|that|\d],而他们真正的意思是(this|that|\d)。 P.S.:(.|\n) 有效,但它的效率可能比字符类略低。
. 不匹配的字符(已经是:\t),则需要重写所有基于这种假设的库......跨度>
PHP 手册page for Dot 指出:
如果设置了 PCRE_DOTALL 选项,则点也匹配换行符。
【讨论】:
这里缺少一个重要的东西。 [\s\S] 匹配一个字符,而换行符可以是一个字符序列。 (Windows 使用两个字符:\r\n。).(带有DOT_ALL 修饰符)和[\s\S] 都不会匹配换行符序列。匹配任何字符或任何换行符的最佳方法是(.|\R),“除换行符或换行符之外的所有内容”。 \R 匹配 \n、\r 和 \r\n。
【讨论】: