2017-07-07 5 views
1

私はカール要求によって返されたHTML文書内の文字列の出現をカウントしようとしています。私は通常substr_countとこれを行うだろうが、私はユーザーが見ることができるテキスト(ブラウザーの読み込まれたページに表示されるテキスト)のみで一致するようにしています。例として、次の段落に遭遇:カウント出現

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

文字列「例」の検索を、私はクラス名、カウントから除外しなければならないため、ここでは1つの発生を数えることを期待します。私は現在、HTMLドキュメントの他の部分を解析するDOMXPathを使うことの最大を使用していますので、私は、この目的のためにそれを使用して、同様による使用に見えた:私は他の人を見つけた

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

は、文書内のテキストを検索するために使用しますが、このタグ内の所見もカウントしているようだ。ユーザーが見ることのできるテキストだけを数える方法はありますか?私は、ユーザーが見ることができますが、テキストがメタデータ、属性などの一部ではないことに注意してください。コンポーネントが表示されないようにスタイルされていて、可視のテキストを生成する場合は、そのテキストを数えます。例:

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

これまでと同じように1つのオカレンスをカウントする必要があります。

EDIT

strip_tags私が示されているインスタンスを処理します。スクリプトなどで見つかったインスタンスを処理する方法はありますか?以下は、カウントに属してはならない:

答えて

1

簡単な方法の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

関連する問題