3

DOMDocumentDOMXPathを使用して、HTMLコンテンツ内のフレーズ(キーワードフレーズ)の存在を判断しています。たとえば、キーワードが太字であるかどうかを検索しています。私は次のコードを使用し、キーワードが検索されるときに一部の文字を「無視」する必要があることを除いて、正常に機能します。次のコードで:

$characters_to_ignore = array(':','(',')','/');
$keyword = 'keyword AAA';
$content = "Some HTML content for example <b>keyword: AAA</b> and other HTML";
$exp = '//b[contains(., "' . $keyword . '")]|//strong[contains(., "' . $keyword . '")]|//span[contains(@style, "bold") and contains(., "' .  $keyword . '")]';

$doc = new DOMDocument();
$doc->loadHTML(strtolower($content));
$xpath = new DOMXPath($doc);
$elements = $xpath->query($exp);

「keyword:AAA」と「keywordAAA」を識別する必要があるため、キーワードフレーズを検索するときに、変数$characters_to_ignoreの文字を無視するようにDOMXPathクエリに指定する必要があります。

前のコードは「キーワードAAA」で正常に機能しますが、「キーワード:AAA」にも一致するように変更するにはどうすればよいですか?(および$ characters_to_ignore内の任意の文字を使用)

新しい情報:多分これを使用していますか?

fn:contains(string1、string2)

しかし、私は実用的な例を得ることができません。

4

1 に答える 1

1

さて、あなたはおそらくすでにそれを何らかの方法で解決しました、しかしここに解決策があります...

XPath 2.0メソッドを使用するのは簡単ですmatches()が、PHPDOMXPathクラスはまだXPath1.0のみをサポートしています。

ただし、PHP 5.3以降、DOMXPathクラスには、PHP関数をXPath関数として使用できるようにするregisterPHPFunctions()メソッドがあります。:)

それを機能させる:

$keyword = 'AAA';
$regex = "|keyword[:()/]? $keyword|";
$content = "Some HTML content for example <b>keyword: AAA</b> and other HTML";
$exp = "//b[php:functionString('preg_match', '$regex', .)]|//strong[php:functionString('preg_match', '$regex', .)]|//span[contains(@style, 'bold') and php:functionString('preg_match', '$regex', .)]";

$doc = new DOMDocument();
$doc->loadHTML($content);
$xpath = new DOMXPath($doc);
$xpath->registerNamespace('php', 'http://php.net/xpath');
$xpath->registerPHPFunctions();
$elements = $xpath->query($exp);
于 2013-07-06T02:50:35.960 に答える