Я ищу регулярное выражение, чтобы найти содержимое первого <h3>
. Что я могу использовать там?
Вы должны использовать php DOM parser вместо регулярных выражений. Вы ищете что-то вроде этого (предупреждение непроверенного кода):
$domd = new DOMDocument(); libxml_use_internal_errors(true); $domd->loadHTML($html_content); libxml_use_internal_errors(false); $domx = new DOMXPath($domd); $items = $domx->query("//h3[position() = 1]"); echo $items->item(0)->textContent;
Ну, простым решением было бы следующее:
preg_match( '#<h3[^>]*>(.*?)</h3>#i', $text, $match ); echo $match[1];
Тем не менее, для всего более сложного вам следует использовать парсер документов HTML.
Вот объяснение, почему анализ HTML с регулярными выражениями является злом. Во всяком случае, это способ сделать это …
$doc = new DOMDocument(); $doc->loadHTML($text); $headings = $doc->getElementsByTagName('h3'); $heading = $headings->item(0); $heading_value = (isset($heading->nodeValue)) ? $heading->nodeValue : 'Header not found';
Подход DOM:
<?php $html = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head><title></title> </head> <body> <h1>Lorem ipsum<h1> <h2>Dolor sit amet<h2> <h3>Duis quis velit est<h3> <p>Cras non tempor est.</p> <p>Maecenas nec libero leo.</p> <h3>Nulla eu ligula est</h3> <p>Suspendisse potenti.</p> </body> </html> '; $doc = new DOMDocument; $doc->loadHTML($html); $titles = $doc->getElementsByTagName('h3'); if( !is_null($titles->item(0)) ){ echo $titles->item(0)->nodeValue; } ?>
Прежде всего: регулярные выражения не являются подходящим инструментом для анализа HTML-кода. Однако в этом случае они должны быть достаточно хорошими, потому что теги H3
не могут быть вложены.
preg_match_all('/<h3[^>]*>(.*?)<\/h3>/si', $source, $matches);
переменная $matches
matches должна содержать контент из тегов H3
.
Используйте выражение xpath, например
"/html/body/h3[0]"
это выберет весь первый узел h3.
Обратите внимание, что это не будет работать на плохо сформированном html.
PHP имеет возможность самостоятельно анализировать HTML DOM – вы почти наверняка хотите использовать это вместо регулярного выражения.
Подробнее см. На этой странице: http://php.net/manual/en/book.dom.php
И проверьте связанные вопросы с правой стороны для людей, задающих очень похожие вопросы.
preg_match("/<h3>(.*)<\/h3>/", $search_in_this_string, $put_matches_in_this_var);