Как извлечь Теги заголовка в PHP от строки

От строки, которая содержит много HTML, как я могу извлечь весь текст из <h1><h2>etc теги в новую переменную.

Возможно использование preg_match_all и отправка соответствий к единственной запятой разграничили переменную.

Спасибо, ребята.

5
задан bluedaniel 14 January 2010 в 14:31
поделиться

6 ответов

Если вы действительно хотите использовать регулярные выражения, я думаю, что:

preg_match_all('/<h[0-6]>([^</h[0-6]>*)</h/i', $string, $matches);

должно работать до тех пор, пока ваши теги заголовков не будут вложены. Как говорили другие, если вы не контролируете HTML, регулярные выражения не лучший способ сделать это.

2
ответ дан 18 December 2019 в 07:09
поделиться

Пожалуйста, также рассмотрите нативный Domdocument класс PHP.

Вы можете использовать $ DOMDOC-> GETELEMANYTAGNAME ('H1') , чтобы получить ваши заголовки.

3
ответ дан 18 December 2019 в 07:09
поделиться

Когда вопрос заключается в том, чтобы извлечь вещи из HTML », ответ никогда не использует регулярные выражения. Вместо этого см. Обсуждение прочный, зрелый HTML-парсер для PHP .

4
ответ дан 18 December 2019 в 07:09
поделиться

Сначала нужно убирать HTML ($ html_str в примере) с помощью tidy:

$tidy_config = array(
    "indent"               => true,
    "output-xml"           => true,
    "output-xhtml"         => false,
    "drop-empty-paras"     => false,
    "hide-comments"        => true,
    "numeric-entities"     => true,
    "doctype"              => "omit",
    "char-encoding"        => "utf8",
    "repeated-attributes"  => "keep-last"
);

$xml_str = tidy_repair_string($html_str, $tidy_config);

, тогда вы можете загрузить XML ($ XML_STR) в Domdocument:

$doc = DOMDocument::loadXML($xml_str);

и, наконец, Вы можете использовать метод Horia Dragomir:

$list = $doc->getElementsByTagName("h1");
for ($i = 0; $i < $list->length; $i++) {
    print($list->item($i)->nodeValue . "<br/>\n");
}

или вы также можете использовать XPath для более сложных запросов на Domdocument (см. http://www.php.net/manual/en/class.domxpath.php )

$xpath = new DOMXPath($doc);
$list = $xpath->evaluate("//h1");
6
ответ дан 18 December 2019 в 07:09
поделиться

Рекомендуется не использовать регекс для этого задания и использовать что-то SimpleHTMLDOM parser

2
ответ дан 18 December 2019 в 07:09
поделиться

Вы, вероятно, лучше используете анализатор HTML. Но для действительно простых сценариев, что-то вроде этого может сделать:

if (preg_match_all('/<h\d>([^<]*)<\/h\d>/iU', $str, $matches)) {
    // $matches contains all instances of h1-h6
}
2
ответ дан 18 December 2019 в 07:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: