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;
}

何か案は?

ありがとう!

編集: 前に明確に述べなかった問題は、このメソッドを使用して foo などの HTML を挿入すると、無効なマークアップが生成されることです。この無効なマークアップは、訪問者に対して「壊れていない」場合でも、レンダリングが不十分になる可能性があります。title 属性と、場合によっては title タグなどの他の要素の一致を除外したいと思います。

編集:元の質問とコードを更新しました。解決策の一部は、 $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 に答える