如何从html内容中分离选定的标签

时间:2016-07-11 14:17:03

标签: php regex preg-match preg-match-all strip-tags

我有一个类似

的HTML
 <span class="address">
   <h1>Dr. Maria Steffens</h1>
   <h4>Institute of Medico</h4>
   <h4></h4>
   <h4></h4>
   <p>Sta. Ana, strt PH-501</p>
   <p>1062 Caracas</p>
   <p>France</p>
  <br>
   <p>Telefon: +58-457-2889567</p>
   <p><a href="mailto:plasticsurgery@yahoo.com">plasticsurgery@yahoo.com</a></p>
   <p><a href="http://">www.mysite.com</a></p>
</span>

现在我想分隔每个标签,如

<h1>Dr. Maria Steffens</h1>

的出现
<h4></h4> tag

我试过

$html = new DOMDocument();
@$html->loadHtmlFile('http://www.sitetofetch.com');
$xpath = new DOMXPath( $html );
$nodelist = $xpath->query( "//*[@class='address']" );

foreach ($nodelist as $n){
  $newhtml = $html->saveHtml($n)."\n";
  $newhtml = htmlentities($newhtml);

$items = $html->getElementsByTagName('h1');
}

但它无法正常工作,

我该怎么做。

1 个答案:

答案 0 :(得分:1)

正如其他人所提到的,改为使用解析器 以下代码段会将HTML加载到DOM并在其上应用xpath查询。显然,这些需要稍微调整,但打印出“Maria Steffens博士”,以下作品:

<?php

$data = <<<DATA
<span class="address">
   <h1>Dr. Maria Steffens</h1>
   <h4>Institute of Medico</h4>
   <h4></h4>
   <h4></h4>
   <p>Sta. Ana, strt PH-501</p>
   <p>1062 Caracas</p>
   <p>France</p>
  <br>
   <p>Telefon: +58-457-2889567</p>
   <p><a href="mailto:plasticsurgery@yahoo.com">plasticsurgery@yahoo.com</a></p>
   <p><a href="http://">www.mysite.com</a></p>
</span>
DATA;

$dom = new DOMDocument();
$dom->loadHTML($data);

$xpath = new DOMXPath($dom);
$headers = $xpath->query("//h1");
foreach ($headers as $header) {
    echo $header->nodeValue;
}
?>

a demo on ideone.com

<小时/> 至于你原来的问题,为什么它不起作用,让我们把你的表达分解成它的部分:

<h1    # match <h1 literally
\s     # followed by one whitespace character (space, tab, newline)
[^>]*  # followed by anything not >, zero or more times
>      # followed by >
(.*)   # anything in that line afterwards
<\/h1> # followed by </h1>

问题是,{em>在<h1>之后没有空白,因此表达式将失败。