Что означает [Ss]* в регулярном выражении в PHP?


Что подразумевается под [\s\S]* в регулярном выражении в PHP? Действительно ли [\S\s]* соответствует каждой строке так же, как .*?

 25
Author: Gung Foo, 2010-12-28

3 answers

По умолчанию . не соответствует новым строкам - [\s\S] является обходом этой проблемы.
Это распространено в JavaScript, но в PHP вы можете использовать флаг /s, чтобы точка соответствовала всем символам.

 40
Author: Kobi, 2010-12-28 08:18:53

Метасимвол . соответствует любому символу, кроме новой строки. Таким образом, шаблон .*, который используется для сопоставления чего-либо, не будет работать, если вам нужно будет сопоставлять новые строки.

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) выключается, если выключен. После выключения любые следующие . не будут соответствовать новой строке.

 16
Author: codaddict, 2010-12-28 08:31:25

[\s\S] Набор символов, соответствующий любому символу, включая разрывы строк.

. Соответствует любому символу, кроме разрывов строк.

 1
Author: arley, 2014-09-06 19:33:59