在PHP中的正则表达式中,[\S\s]* 代表什么意思?

43

[\s\S]* 在 PHP 的正则表达式中是什么意思?它是否与 .* 一样匹配每个字符串?

3个回答

62

默认情况下,.不能匹配换行符-[\s\S]是解决该问题的一种技巧。
这在JavaScript中很常见,但在PHP中,您可以使用/s标志使点匹配所有字符。


“.” 什么时候匹配换行符? - yoyo
@BoltClock - 谢谢,我正好在处理这个问题,只是需要确认 PHP 中是如何完成的。 - Kobi
@yoyo - 我已经将“有时”更改为“默认情况下”。除非您告诉它匹配,否则它不会匹配。只是为了明确 - 除非您希望在同一正则表达式中使用混合行为(codaddict已将其编辑到答案中),否则可能没有很好的理由使用它。 - Kobi
如果我没记错的话,在JavaScript中,您可以使用m修饰符来实现与PHP中的/s相同的效果。 - PhiLho
2
@PhiLho - /m 改变了 ^$ 的含义,使它们也匹配换行符,但对 . 没有影响。称呼 /ssingleline 是一个历史错误,会与 multiline 引起混淆,应该称之为 Dot-Matches-All - Kobi
1
@Kobi 你是对的,所以我确实弄错了... :-) 例如 https://developer.mozilla.org/en/docs/Web/JavaScript/Guide/Regular_Expressions 就很清楚 .m 的语义。 - PhiLho

28

. 元字符匹配除了换行符以外的任何字符。因此用于匹配任何内容的模式 .* 在需要匹配换行符时无法使用。

preg_match('/^.*$/',"hello\nworld"); // returns 0

[\s\S] 是一个包含空格字符和非空格字符的字符类,匹配任何字符,包括换行符,所以 [\d\D][\w\W] 也可以达到同样的效果。因此,你的模式 [\s\S]* 现在匹配任何内容。

preg_match('/^[\s\S]$/s',"hello\nworld"); // returns 1

使.匹配任何字符(包括换行符)的替代方法是使用s修饰符。

preg_match('/^.*$/s',"hello\nworld"); // returns 1 

使用s修饰符的替代方式是将其内联:

preg_match('/^(?s).*(?-s)$/',"hello\nworld"); // returns 1

(?s) 开启 s 模式,(?-s) 关闭。一旦关闭,任何后面的 . 都不会匹配换行符。


最后一位只修改相邻的 . 的行为吗?我以前没见过这种语法。 - BoltClock
1
@BoltClock - 你可以在行内设置或清除标志 - 它适用于所有点,直到你清除它:(?smi).*abc(?-smi).*aBc - Kobi

5

[\s\S]表示匹配任何字符,包括换行符。

.表示匹配除换行符以外的任何字符。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接