What is meant by [\\s\\S]*
in regex in PHP? Does [\\s\\S]*
actually match every string the same as .*
?
[\s\S]
A character set that matches any character including line breaks.
.
Matches any character except line breaks.
By default .
doesn't match new lines - [\s\S]
is a hack around that problem.
This is common in JavaScript, but in PHP you can use the /s
flag to to make the dot match all characters.
The .
meta character matches any character except a newline. So the pattern .*
which is used to match anything will not work if you have to match newlines as-well.
preg_match('/^.*$/',"hello\nworld"); // returns 0
[\s\S]
which is a character class of white-space characters and non-whitespace characters matches any character including a newline so do [\d\D]
, [\w\W]
. So your pattern [\s\S]*
now matches anything.
preg_match('/^[\s\S]$/s',"hello\nworld"); // returns 1
An alternative to make .
match anything (including a newline) is to use a s
modifier.
preg_match('/^.*$/s',"hello\nworld"); // returns 1
Alternative way of using the s
modifier is in-lining it as:
preg_match('/^(?s).*(?-s)$/',"hello\nworld"); // returns 1
(?s)
turns on the s
mode and (?-s)
turns if off. Once turned off any following .
will not match a newline.