繁体   English   中英

使用PHP DOMXpath和通配符时排除HTML属性

[英]Exclude HTML attributes when using PHP DOMXpath and wildcards

我正在尝试使用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)时会生成无效的标记。 这种无效的标记即使没有“破坏”访问者,也可能导致效果不佳。 我想排除匹配title属性以及可能的其他元素,例如title标签等。

编辑:我已经更新了原始问题和代码。 解决方案的一部分是更改$ match = $ doc-> saveXML($ match); 因为它保留了HTML标记。 但是,我无法排除HTML属性,但是可以使用其他正则表达式省略那些匹配项。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM