1

我正在尝试使用 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 属性,但可以通过进一步的正则表达式省略这些匹配项。

4

1 回答 1

0

title="foo" 中缺少等号

<ul>
  <li>
    <a href="#" title="foo"><span>fooey</span></a>
 </li>
</ul>

这似乎对我有用:

    $body = JResponse::getBody();
    // test
    $doc = new DOMDocument;
    $doc->loadHTML($body);
    $xpath = new DOMXPath($doc);
    $targets = 'Foo, foo';
    $targets = explode(',', $targets);

     foreach ($targets as $target) {

         $query = "//*[contains(text(),'".trim($target)."')]";
         echo $query .'<br>';

         foreach($xpath->query($query) as $match) {

            $match = $match->textContent;
            echo 'match: ' . $match .'<br>';

        }

     }

输出:

//*[contains(text(),'Foo')]
//*[contains(text(),'foo')]
match: fooey
于 2012-05-15T20:09:06.900 回答