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

У меня есть строка, которая содержит обычные символы, белые кодировки и символы новой строки между и. Это регулярное выражение не работает: /<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> 

Обычно в компиляторе регулярных выражений есть флаг, указывающий, что точка должна соответствовать символам новой строки.