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