2017-07-07 72 views
1

我正在尝试计算由curl请求返回的HTML文档中字符串的出现次数。我通常会用substr_count来做到这一点,但我希望只匹配用户可见的文本(在浏览器加载的页面中看到的文本),而不是来源中的所有匹配。作为一个例子,遇到以下段落:计算HTML文档中可见文本的出现次数

<p class="example">example</p> 

搜索字符串“榜样”,我希望到这里算一次发生,因为类的名字应该从计数被省略。我目前使用DOMXpath来解析HTML文档的其他部分,所以我看着使用它用于此目的,以及使用:

$xpath->query("//text()[contains(., 'example')]"); 

,我发现其他人使用查找文档中的文本,但是这似乎也计数标签内的发现。有没有一种方法可以只依赖用户可见的文本?我想指出,用户可见仅仅意味着文本不是元数据,属性等的一部分。如果组件的样式不可见,但会产生可见的文本,则应对该文本进行计数。例如:

<p class="example" style="visibility:hidden">example</p> 

仍然应该如前所述统计一次。

编辑

strip_tags将处理我已经表明了实例。有没有办法处理在脚本等内找到的实例?以下不应归属于计数:

<script type="text/javascript">var example = 1 ....other stuff....</script> 

回答

1

一个简单的方法是删除标记。

$str = '<p class="example">example</p> 
<p class="example" style="visibility:hidden">example</p> 
<script type="text/javascript">var example = 1 
....other stuff.... 
</script>'; 

$arr = explode(PHP_EOL, $str); 

for($i = 0; $i < count($arr); $i++){ 

    if(strpos($arr[$i], "hidden") !== false){ 
     // remove hidden tag 
     unset($arr[$i]); 
    }else if(strpos($arr[$i], "<script") !== false){ 
     while(strpos($arr[$i], "</script") === false){ 
      // remove the scripts from the html. 
      unset($arr[$i]); 
      $i++; 
     } 
     unset($arr[$i]); // and remove the last line with "</script" 
    } 
} 
$str = implode(PHP_EOL, $arr); 

Echo substr_count(strip_tags($str), "example"); 

https://3v4l.org/d4JN5

+0

这会照顾直列出现的,有没有什么办法来处理脚本中出现?我将编辑该问题以更好地显示 – yanman1234

+0

@ yanman1234指出的点...尝试上面的代码。它可能不完美,但它是一个概念的证明。在新行上拆分html,并查看每行隐藏或脚本,如果找到,则删除该行。然后,所有剩下的都应该是标签和可见文本,因此带状标签应该给出正确的结果。 – Andreas

+0

虽然这有其缺陷,但我认为你是对的,我需要在搜索之前手动清理文档。谢谢! – yanman1234