Что [\ S \ s] * означает в регулярных выражениях в PHP? - PullRequest
30 голосов
/ 28 декабря 2010

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

Ответы [ 3 ]

47 голосов
/ 28 декабря 2010

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

17 голосов
/ 28 декабря 2010

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

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

2 голосов
/ 06 сентября 2014

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...