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

Я пытаюсь разобрать блок с html-страницы, поэтому я пытаюсь выполнить preg_match этот блок с помощью php

 if( preg_match('<\/div>(.*?)<div class="adsdiv">', $data, $t)) 

но не работает

 </div> blablabla blablabla blablabla <div class="adsdiv"> 

я хочу grep только blablabla blablabla слова любая помощь

Regex – правильный инструмент для этого . Вот как это сделать с DOM

 $html = <<< HTML <div class="parent"> <div> <p>previous div<p> </div> blablabla blablabla blablabla <div class="adsdiv"> <p>other content</p> </div> </div> HTML; 

Контент в HTML-документе – это TextNodes. Теги – ElementNodes. Ваш TextNode с содержимым blablabla должен иметь родительский узел. Для получения значения TextNode мы предположим, что вы хотите, чтобы весь TextNode ParentNode из div с атрибутом class adsdiv

 $dom = new DOMDocument; $dom->loadHTML($html); $xPath = new DOMXPath($dom); $nodes = $xPath->query('//div[@class="adsdiv"]'); foreach($nodes as $node) { foreach($node->parentNode->childNodes as $child) { if($child instanceof DOMText) { echo $child->nodeValue; } }; } 

Да, это не фанковый один лайнер, но он также гораздо меньше болит и дает вам полный контроль над HTML-документом. Используя Силу запроса XPath, мы могли бы сократить

 $nodes = $xPath->query('//div[@class="adsdiv"]/../text()'); foreach($nodes as $node) { echo $node->nodeValue; } 

Я сохранил это дословно, чтобы проиллюстрировать, как использовать DOM.

Помимо сказанного выше, также добавьте модификатор /s . будет соответствовать новым символам. (отредактируйте: как любезно указал Алан, [^<]+ будет соответствовать новым символам)

Я всегда использую /U так как в этих случаях вы обычно хотите минимальное сопоставление по умолчанию. (также будет быстрее). И /i поскольку люди говорят <div> , <DIV> или даже <Div>

 if (preg_match('/<\/div>([^<]+)<div class="adsdiv">/Usi', $data, $match)) { echo "Found: ".$match[1]."<br>"; } else { echo "Not found<br>"; } 

редактирование сделало его немного более явным!

Из руководства PHP :

s (PCRE_DOTALL). Если этот модификатор установлен, метасимвол точки в шаблоне соответствует всем символам, включая символы новой строки. Без него новые строки исключаются. Этот модификатор эквивалентен модификатору Perl / s. Отрицательный класс, такой как [^ a], всегда соответствует символу новой строки, независимо от настройки этого модификатора.

Итак, должно работать следующее:

 if (preg_match('~<\/div>(.*?)<div class="adsdiv">~s', $data, $t)) 

~ Там, чтобы разграничить регулярное выражение.

Вам нужно разграничить регулярное выражение; используйте /<\/div>(.*?)<div class="adsdiv">/ вместо этого.