Я пытаюсь разобрать блок с 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">/
вместо этого.