Как я создаю regex, который принимает во внимание, что предмет состоит из нескольких строк?
"m
"модификатор для каждый, кажется, не работает.
Максвелл Трой Милтон Кинг прав, но, поскольку его ответ кратковременный, я отправлю его это тоже и привести несколько примеров для иллюстрации.
Во-первых, .
метасимвол по умолчанию НЕ соответствует разрывам строки. Это верно для многих реализаций регулярных выражений, включая разновидность PHP. Тем не менее, возьмите текст:
$text = "Line 1\nLine 2\nLine 3";
и регулярное выражение
'/.*/'
, тогда регулярное выражение будет соответствовать только Строка 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' позволяет использовать начала и концы строк ^ и $.