[\s\S]*
在 PHP 的正则表达式中是什么意思?它是否与 .*
一样匹配每个字符串?
默认情况下,.
不能匹配换行符-[\s\S]
是解决该问题的一种技巧。
这在JavaScript中很常见,但在PHP中,您可以使用/s
标志使点匹配所有字符。
.
元字符匹配除了换行符以外的任何字符。因此用于匹配任何内容的模式 .*
在需要匹配换行符时无法使用。
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(?smi).*abc(?-smi).*aBc
- Kobi[\s\S]
表示匹配任何字符,包括换行符。
.
表示匹配除换行符以外的任何字符。
m
修饰符来实现与PHP中的/s
相同的效果。 - PhiLho/m
改变了^
和$
的含义,使它们也匹配换行符,但对.
没有影响。称呼/s
为singleline
是一个历史错误,会与multiline
引起混淆,应该称之为Dot-Matches-All
。 - Kobi.
和m
的语义。 - PhiLho