Регулярное выражение PHP preg_replace, которое соответствует нескольким строкам - PullRequest
15 голосов
/ 11 февраля 2010

Как мне создать регулярное выражение, которое учитывает, что тема состоит из нескольких строк?

Модификатор "m" для одной из них не работает.

Ответы [ 2 ]

47 голосов
/ 11 февраля 2010

Максвелл Трой Милтон Кинг прав, но поскольку его ответ немного короток, я также опубликую это и приведу несколько примеров для иллюстрации.

Во-первых, метасимвол . по умолчанию НЕ соответствует разрывам строк. Это верно для многих реализаций регулярных выражений, в том числе для PHP. Тем не менее, возьмите текст:

$text = "Line 1\nLine 2\nLine 3";

и регулярное выражение

'/.*/'

, тогда регулярное выражение будет соответствовать только Line 1. Убедитесь сами:

preg_match('/.*/', $text, $match);
echo $match[0]; // echos: 'Line 1'

, поскольку .* "прекращает сопоставление" в \n (символ новой строки). Если вы хотите, чтобы оно совпадало и с переносами строк, добавьте s-модификатор (он же модификатор DOT-ALL) в конце вашего регулярного выражения:

preg_match('/.*/s', $text, $match);
echo $match[0]; // echos: 'Line 1\nLine 2\nLine 3'

Теперь о m-модификаторе (многострочном): это позволит ^ соответствовать не только началу входной строки, но и началу каждой строки. То же самое с $: это позволит $ соответствовать не только концу входной строки, но и концу каждой строки.

Пример:

$text = "Line 1\nLine 2\nLine 3";
preg_match_all('/[0-9]$/', $text, $matches);
print_r($matches); 

, который будет соответствовать только 3 (в конце ввода). Но:

, но с включенным m-модификатором:

$text = "Line 1\nLine 2\nLine 3";
preg_match_all('/[0-9]$/m', $text, $matches);
print_r($matches);

все (одиночные) цифры в конце каждой строки («1», «2» и «3») совпадают.

8 голосов
/ 11 февраля 2010

Попробуйте модификатор 's'. Значение «обрабатывать как одну строку».

'm' позволяет использовать начало и конец строки ^ и $.

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