使用DOMDocument和DOMXPath如何忽略匹配的某些字符?

时间:2012-11-19 23:40:25

标签: php domdocument domxpath

我正在使用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”以及“关键字AAA”,因此在搜索关键字词组时,我需要指定DOMXPath查询忽略变量$ characters_to_ignore中的字符。

以前的代码适用于“关键字AAA”,如何更改它以匹配“关键字:AAA”? (以及$ characters_to_ignore中的任何字符)

新信息: 也许使用this

  

FN:含有(字符串1,字符串)

但我无法得到一个有效的例子。

1 个答案:

答案 0 :(得分:1)

嗯,你可能已经以某种方式解决了它,但这是解决方案......

使用XPath 2.0方法matches()将是微不足道的,但PHP DOMXPath类仅支持XPath 1.0。

但是从PHP 5.3开始,DOMXPath类具有registerPHPFunctions()方法,允许我们将PHP函数用作XPath函数。 :)

让它发挥作用:

$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);