2017-07-07 64 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

相關問題