php:从网页中提取特定标记之间的文本

php:从网页中提取特定标记之间的文本,php,regex,html-parsing,Php,Regex,Html Parsing,可能重复: 我知道我应该使用一个html解析器,比如php domdocument()或tagsoup 如何使用php domdocument提取特定标记之间的文本,例如获取h1、h2、h3、p和表之间的文本?似乎我只能用getelementbytagname对一个标记执行此操作 对于这样的任务,有更好的html解析器吗?或者我如何循环遍历php文档 您可以使用正则表达式执行此操作 preg_match_all('#<h1>([^<]*)</h1>#Usi', $

可能重复:

我知道我应该使用一个html解析器,比如php domdocument()或tagsoup

如何使用php domdocument提取特定标记之间的文本,例如获取h1、h2、h3、p和表之间的文本?似乎我只能用getelementbytagname对一个标记执行此操作


对于这样的任务,有更好的html解析器吗?或者我如何循环遍历php文档

您可以使用正则表达式执行此操作

preg_match_all('#<h1>([^<]*)</h1>#Usi', $html_string, $matches);
foreach ($matches as $match)
{
  // do something with $match
}

preg_match_all('#)([^如果您是正确的,请使用DomDocument(因为正则表达式不是解析HTML的好方法。为什么?请参阅和了解原因)

getElementsByTagName
为您提供了一个可以迭代以获取所有找到的元素的文本的方法。因此,您的代码可能类似于:

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

$tags = array ('h1', 'h2', 'h3', 'h4', 'p');
$texts = array ();
foreach($tags as $tag)
{
  $elementList = $document->getElementsByTagName($tag);
  foreach($elementList as $element)
  {
     $texts[$element->tagName][] = $element->textContent;
  }
}
return $texts;

请注意,这里可能会有一些错误处理,并且还会丢失文本的上下文,但您可能可以根据自己的需要编辑此代码。

我不确定您的源代码是什么,因此我添加了一个函数来通过URL获取内容

$file = file_get_contents($url);

$doc = new DOMDocument();
$doc->loadHTML($file);

$body = $doc->getElementsByTagName('body');
$h1 = $body->getElementsByTagName('h1');
我不确定这一部分:

for ($i = 0; $i < $items->length; $i++) {
    echo $items->item($i)->nodeValue . "\n";
}
以下是有关nodeValue的更多信息:


希望能有所帮助!

请不要为此使用regex!regex在解析HTML方面的可靠性是出了名的差。谢谢,看起来不错。在一些网页上试用过,比如yahoo.com(刚刚添加了
$HTML=file\u get\u contents(“http://yahoo.com”;
,但它总是失败,并给出可怕的
domdocument.loadhtml]:htmlParseEntityRef:实体中应为“;”,我想必须检查tagsoup或simplehtmldom:)不过算法看起来不错。
foreach ($items as $item) {
    echo $item->nodeValue . "\n";
}