PHP preg_replace регулярное выражение, которое соответствует нескольким строкам

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

Модификатор " m " для одного, похоже, не работает.

Ответ 1

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

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

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

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

'/.*/'

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

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

так как .* "перестает соответствовать" на \n (новая строка char). Если вы хотите, чтобы это соответствовало разрыву строк, добавьте модификатор 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" ).

Ответ 2

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

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