Я уверен, что это тривиально, но я не могу создать регулярное выражение, которое учитывает, что объект состоит из нескольких строк. Модификатор « m
» для одного не работает.
Максвелл Трой Милтон Кинг прав, но, так как его ответ немного короткий, я опубликую его и приведу примеры для иллюстрации.
Во-первых,. метасимвол по умолчанию НЕ соответствует разрыву строки. Это справедливо для многих реализаций регулярных выражений, включая вкус 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») совпадают.
Вы попробовали 's' модификатор? Значение «рассматривать как одну линию. 'm' позволяет использовать начальные и конечные строки $ и $ line.