What is meant by [\s\S]*
in regex in PHP? Does [\s\S]*
actually match every string the same as .*
?

- 3,683
- 4
- 33
- 41

- 1,113
- 2
- 17
- 25
3 Answers
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.

- 135,331
- 41
- 252
- 292
-
When does `.` match new line? – yoyo Dec 28 '10 at 08:20
-
@BoltClock - Thanks, I was just getting to it, just had to confirm that's how it's done in PHP. – Kobi Dec 28 '10 at 08:20
-
@yoyo - I've changed "Sometimes" to "by default". It doesn't match unless you tell it to match. Just to be clear - there's probably no good reason to use it, unless you want mixed behavior in the same regex, which can also be achieved in better ways (which I see codaddict has already edited into his answer). – Kobi Dec 28 '10 at 08:22
-
If I am not mistaken, in JavaScript, you can use the `m` modifier for the same effect than `/s` in PHP. – PhiLho Jun 09 '14 at 09:00
-
2@PhiLho - `/m` changes the meaning of `^` and `$`, so they also match newlines, it has no effect on `.`. Calling `/s` `singleline` is an historical error which causes confusion with `multiline`, it should be `Dot-Matches-All`. – Kobi Jun 09 '14 at 09:12
-
1@Kobi You are right, so I was indeed mistaken... :-) https://developer.mozilla.org/en/docs/Web/JavaScript/Guide/Regular_Expressions for example is clear on the `.` and `m` semantics. – PhiLho Jul 11 '14 at 11:25
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.

- 445,704
- 82
- 492
- 529
-
Does the last bit only modify the behavior of the adjacent `.`? I've not seen that syntax before. – BoltClock Dec 28 '10 at 08:24
-
1@BoltClock - you can set or clear flags inline - it works for all dots until you clear it: `(?smi).*abc(?-smi).*aBc` – Kobi Dec 28 '10 at 08:28
[\s\S]
A character set that matches any character including line breaks.
.
Matches any character except line breaks.

- 947
- 1
- 13
- 19