1

私は現在、サイトのいくつかの検索機能にPHPCrawlerを使用しています。一部のページ要素をインデックスから削除する必要があります。

たとえば、私は以下を使用しました:

$doc_body = preg_replace('/<li>(.*?)<\/li>/is', "", $doc_body);

結果にリストが必要ないため、リストを削除します。これは、正しく機能します。

さて、私が削除する必要があるもう一つのことは次のとおりです:

<div class="example">all contents within</div>

だからこれのために私は試しました:

   $doc_body = preg_replace('/<div(.*?)class="(.*?)example(.*?)"(.*?)>(.*?)<\/div>/is', "", $doc_body);

すべてのページにdivクラスの例があるとは限らないため、エラーが発生します。だから私はそれを次のコードで適応させました:

      if(strpos($doc_body,'<div class="example">')){
      $doc_body = preg_replace('/<div(.*?)class="(.*?)example(.*?)"(.*?)>(.*?)<\/div>/is', "", $doc_body);
      }

残念ながら、それも機能しません!エラーは発生しませんが、結果からすべてのコンテンツが削除されるわけではありません。

phpcrawlerまたはDomdocumentのいずれかを使用するのはこれが初めてです...ここでの私の問題がそれらと関係があるかどうかはわかりませんが?

4

1 に答える 1

1

CSSと同じようにドキュメントモデルをクエリするために使用されるDOMDocumentXPathを確認することをお勧めしますが、構文は少し異なります。W3Schoolsには、XPathに関する軽量のチュートリアルがあります

正規表現は、リソースと時間がかかるため、ドキュメント全体を解析する場合は常にお勧めできません。

たとえば、を使用してクラス「example」を持つすべてのdivを検索するにXPathは、ドキュメントをそのようにクエリするだけです。

//div[@class="example"]

次に、APIを使用してノードを削除し、DOMDocument最後に正規化して、最終的な結果を取得します。

$doc = new DOMDocument();
$xpath = new DOMXPath($doc);
$doc->loadHTML($html);

// Remove all the lists
foreach ($xpath->query("//ul | //ol") as $node) {
     $node->parentNode->removeChild($node);
}

// Remove all <div class="example" /> nodes
foreach ($xpath->query("//div[@class='example']") as $node) {
     $node->parentNode->removeChild($node);
}

$doc->normalize();

// Get the final document for indexing
$html = $doc->saveHTML();
于 2013-01-31T23:27:25.637 に答える