我正在尝试使用 PHP DOMXpath 匹配 Joomla 站点上的多个字符串,查询如下:
$query = "//*[contains(text(),'$target'))]";
HTML 标记的示例如下:
<ul>
<li>
<a href="#" title="foo bar"><span>foo bar</span></a>
</li>
</ul>
整个 PHP 函数(为清楚起见进行了修改)是:
function onAfterRender() {
$buffer = JResponse::getBody();
$doc = new DOMDocument;
$doc->loadHTML($buffer);
$xpath = new DOMXPath($doc);
$targets = 'Foo, foo';
$targets = explode(',', $targets);
foreach ($targets as $target) {
$query = $xpath->evaluate("//*[contains(.,'" . trim($target) . "')]");
foreach($query as $match) {
$match = $doc->saveXML($match);
$replacement = preg_replace("/($target)/i",'<i class="notranslate">' . $target. '</i>',$match);
$buffer = str_replace($match, $replacement, $buffer);
JResponse::setBody($buffer);
}
}
return true;
}
有任何想法吗?
谢谢!
编辑:我之前没有明确说明的问题是,当使用这种方法注入 HTML 时,比如 foo,会生成无效标记。这种无效标记可能会很差地呈现给访问者,如果不是“破坏”的话。我想排除匹配的标题属性和可能的其他元素,如标题标签等。
编辑:我已经更新了原始问题和代码。部分解决方案是更改 $match = $doc->saveXML($match); 因为它保留了 HTML 标记。但是,我无法排除 HTML 属性,但可以通过进一步的正则表达式省略这些匹配项。