Как я могу найти содержимое первого тега h3? - PullRequest
3 голосов
/ 04 октября 2010

Я ищу регулярное выражение для поиска содержимого первого тега <h3>. Что я могу использовать там?

Ответы [ 8 ]

4 голосов
/ 04 октября 2010

Вы должны использовать DOM-парсер php вместо регулярных выражений.Вы ищете что-то вроде этого (предупреждение о непроверенном коде):

$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;
3 голосов
/ 04 октября 2010

Подход 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;
}

?>
3 голосов
/ 04 октября 2010

Ну, простое решение будет следующим:

preg_match( '#<h3[^>]*>(.*?)</h3>#i', $text, $match );
echo $match[1];

Для всего более сложного, вы должны рассмотреть возможность использования анализатора HTML-документов.

2 голосов
/ 04 октября 2010

Здесь объясняет, почему анализ 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';
1 голос
/ 04 октября 2010

Используйте выражение xpath, например

"/html/body/h3[0]"

, при этом будет выделен весь первый узел h3.

Обратите внимание, что это не будет работать с плохо сформированным html.

1 голос
/ 04 октября 2010

Прежде всего: регулярные выражения не являются подходящим инструментом для анализа HTML-кода.Однако в этом случае они должны быть достаточно хорошими, поскольку теги H3 не могут быть вложенными. Переменная

preg_match_all('/<h3[^>]*>(.*?)<\/h3>/si', $source, $matches);

$matches должна содержать содержимое из тегов H3.

0 голосов
/ 04 октября 2010

PHP имеет возможность естественного анализа HTML DOM - вы почти наверняка захотите использовать его вместо регулярных выражений.

Для получения подробной информации см. Эту страницу: http://php.net/manual/en/book.dom.php

И проверьте соответствующие вопросы справа от людей, задающих очень похожие вопросы.

0 голосов
/ 04 октября 2010
preg_match("/&lt;h3&gt;(.*)&lt;\/h3&gt;/", $search_in_this_string, $put_matches_in_this_var);
...