计算PHP页面中的所有HTML标记

时间:2010-07-06 07:25:20

标签: php html regex

我花时间在正则表达式上来解决这个问题,但没有结果 我尝试使用PHP 5.3解决这个问题 信息类似 - 页面中重复的次数和页面中所有标签的信息。

3 个答案:

答案 0 :(得分:17)

遗憾的是,您的问题在目前的形式中几乎无法理解。请尝试更新它并更具体。如果您想计算页面中的所有HTML标记,您可以执行以下操作:

$HTML = <<< HTML
<html>
    <head>
        <title>Some Text</title>
    </head>
    <body>
        <p>Hello World<br/>
            <img src="earth.jpg" alt="picture of earth from space"/>
        <p>
        <p>Counting Elements is easy with DOM</p>
    </body>
</html>
HTML;

使用DOM计算所有DOMElements:

$dom = new DOMDocument;
$dom->loadHTML($HTML);
$allElements = $dom->getElementsByTagName('*');
echo $allElements->length;

上面将输出8,因为DOM中有八个元素。如果您还需要知道元素的分布,您可以

$elementDistribution = array();
foreach($allElements as $element) {
    if(array_key_exists($element->tagName, $elementDistribution)) {
        $elementDistribution[$element->tagName] += 1;
    } else {
        $elementDistribution[$element->tagName] = 1;
    }
}
print_r($elementDistribution);

这将返回

Array (
    [html] => 1
    [head] => 1
    [title] => 1
    [body] => 1
    [p] => 2
    [br] => 1
    [img] => 1
)

请注意,getElementsByTagName仅返回DOMElements。它没有考虑结束标记,也没有返回其他DOMNode。如果您还需要计算结束标记和其他节点类型,请考虑改为使用XMLReader

答案 1 :(得分:1)

$testHTML = file_get_contents('index.html');

$search = preg_match_all('/<([^\/!][a-z1-9]*)/i',$testHTML,$matches);

echo '<pre>';
var_dump($matches[1]);
echo '</pre>';

为您提供所有标签的数组。一旦数据在数组中,您就可以使用所有标准PHP数组函数 - 例如array_count_values() - 提取你想要的细节......虽然你并没有真正说出你想要的关于html标签的信息

将array_count_values()与preg_match_all()的结果一起使用:

echo '<pre>';
var_dump(array_count_values($matches[1]));
echo '</pre>';

给出

array(5) {
  ["html"]=>
  int(1)
  ["head"]=>
  int(1)
  ["title"]=>
  int(1)
  ["body"]=>
  int(1)
  ["h1"]=>
  int(2)
}

这是你想要的吗?

答案 2 :(得分:0)

我建议您结帐simple html dom

http://simplehtmldom.sourceforge.net/manual.htm