У меня есть строка, которая содержит обычные символы, белые кодировки и символы новой строки между и. Это регулярное выражение не работает: /<div>(.*)<\/div>
. Это связано с тем, что .*
не соответствует символам новой строки. Мой вопрос: как это сделать?
Как сделать совпадение символов в точках с использованием регулярных выражений
Ответ 1
Вам нужно использовать модификатор DOTALL.
'/<div>(.*)<\/div>/s'
Это может не дать вам именно то, что вы хотите, потому что вы жадные соответствия. Вместо этого вы можете попробовать не-жадный матч:
'/<div>(.*?)<\/div>/s'
Вы также можете решить это, сопоставляя все, кроме '<' если нет других тегов:
'/<div>([^<]*)<\/div>/'
Другое замечание состоит в том, что вам не нужно использовать /
в качестве разделителей регулярных выражений. Использование другого символа означает, что вам не нужно скрывать /
в </div>
, улучшая читаемость. Это относится ко всем приведенным выше регулярным выражениям. Здесь будет выглядеть, если вы используете '#' вместо '/':
'#<div>([^<]*)</div>#'
Однако все эти решения могут выйти из строя из-за вложенных div, дополнительных пробелов, комментариев HTML и других вещей. HTML слишком сложный для синтаксического анализа с помощью Regex, поэтому вам следует рассмотреть возможность использования парсера HTML.
Ответ 2
чтобы совместить все символы, вы можете использовать этот трюк:
%\<div\>([\s\S]*)\</div\>%
Ответ 3
Я знаю, что это старый, но так как я наткнулся на него недавно. Вы также можете использовать модификатор режима (?s)
. Например.
(?s)/<div>(.*?)<\/div>
Ответ 4
Обычно в компиляторе регулярных выражений есть флаг, указывающий, что точка должна соответствовать символам новой строки.