1

我有一个像这样的 html 字符串(这不是完整的 html):

<h2>Title A</h2>
  <p>aaaaaa</p>
  <p>bbbbbb</p>
<h2>Title B</h2>
  <p>aaaaaa</p>
  <p>bbbbbb</p>
<h2>Title C</h2>
  <p>aaaaaa</p>
  <p>bbbbbb</p>

我想得到一个只有标题的数组(来自 h2 标签):

array(Title A, title B, Title C);

我正在使用 php。

我努力了

strip_tags(string,'<h2>')

但我得到的是标题,然后是<p>标签后的内容。

4

5 回答 5

14

您可以尝试使用DOMDocument

    $html = '<h2>Title A</h2>
      <p>aaaaaa</p>
      <p>bbbbbb</p>
    <h2>Title B</h2>
      <p>aaaaaa</p>
      <p>bbbbbb</p>
    <h2>Title C</h2>
      <p>aaaaaa</p>
      <p>bbbbbb</p>';

$dom = new \DOMDocument();
$dom->loadHTML($html);

$items = $dom->getElementsByTagName('h2');

for($i = 0; $i < $items->length; $i ++) {
    echo $items->item($i)->nodeValue . PHP_EOL;
}

输出

Title A
Title B
Title C
于 2012-09-28T09:23:44.177 回答
3

PHP 已经内置了很好的 HTML 解析库,这里有一个带有 xpath 的解析器:

$h2 = array_map(
    'strval', simplexml_import_dom(\DomDocument::loadHTML($html))->xpath('//h2')
);

输出:

array(3) {
  [0]=>
  string(7) "Title A"
  [1]=>
  string(7) "Title B"
  [2]=>
  string(7) "Title C"
}

另请参阅其他与 DOMDocument 相关的答案,如果您听到 HTML 和 PHP,只需想到 DomDocument。


$doc = new DomDocument;
$doc->loadHTML($html);
$h2  = array_map(
    'strval', simplexml_import_dom($doc)->xpath('//h2')
);
于 2012-09-28T09:32:08.833 回答
1

您可以使用 SimpleXML 而不是 DOMDocument

http://codepad.viper-7.com/Esairr

$html = '
    <html>
        <h2>Title A</h2>
        <p>aaaaaa</p>
        <p>bbbbbb</p>
        <h2>Title B</h2>
        <p>aaaaaa</p>
        <p>bbbbbb</p>
        <h2>Title C</h2>
        <p>aaaaaa</p>
        <p>bbbbbb</p>
    </html>';
$xml = new SimpleXMLElement($html);

echo "<pre>";
print_r($xml->h2);
echo "</pre>";

输出

SimpleXMLElement Object
(
    [0] => Title A
    [1] => Title B
    [2] => Title C
)
于 2012-09-28T09:28:19.753 回答
1

您应该使用诸如DomDocument之类的解析器来解析 HTML。

于 2012-09-28T09:22:21.327 回答
0

你可以使用preg_match_all

preg_match_all("/<h2>(.*?)</h2>/si", $sResource, $aTitles);
print_r($aTitles[1]);

不鼓励像这样使用 PHP 解析 HTML,因为特定的字符、换行符等可能会干扰您的脚本。DOM Parser 将是一个很好且简单的替代方案。

于 2012-09-28T09:25:27.770 回答