ホームページ > バックエンド開発 > PHPチュートリアル > 正規表現の置換中に HTML タグを効率的に無視するにはどうすればよいですか?

正規表現の置換中に HTML タグを効率的に無視するにはどうすればよいですか?

Mary-Kate Olsen
リリース: 2024-11-12 06:24:02
オリジナル
304 人が閲覧しました

How to Efficiently Ignore HTML Tags During Regular Expression Replacement?

正規表現置換での HTML タグの無視

正規表現は、複雑な HTML 解析タスクを処理するには不十分であることが多く、特に選択的などの場合に対処する場合には注意が必要です。タグを無視します。このようなシナリオでは、代わりに DOMDocument と DOMXPath を使用することが一般に推奨されます。

DOMXPath ベースのアプローチ

置換の実行中に HTML タグを無視するには、DOMXPath を使用して、文書内のテキスト要素を選択的に検索します。たとえば、次のクエリは、検索語「apple span」を含むすべてのテキスト ノードを検索します。

//*[contains(., "apple span")]/*[FALSE = contains(., "apple span")]/..
ログイン後にコピー

TextRange クラスの作成

次に、カスタムTextRange クラスを作成して、DOM テキスト ノードのリストを表すことができます。このクラスを使用すると、これらのテキスト ノード上で文字列操作を単一の文字列であるかのように実行できます。

検索結果の処理

一致するテキスト ノード範囲ごとに、< ;スパン>要素を作成してテキスト ノードの周囲に挿入して、テキスト ノードを強調表示できます。これにより、HTML タグに影響を与えることなく、目的の結果が生成されます。

このアプローチを示すサンプル コードを次に示します。

$doc = new DOMDocument;
$doc->loadXML('<html><body>This is some <span>text</span> that span</body></html>');
$xp = new DOMXPath($doc);

$anchor = $doc->getElementsByTagName('body')->item(0);
$r = $xp->query('//*[contains(., "span")]/*[FALSE = contains(., "span")]/..', $anchor);

foreach($r as $node)
{   
    $textNodes = $xp->query('.//child::text()', $node);
    $range = new TextRange($textNodes);
    while(FALSE !== $start = strpos($range, "span"))
    {
        $base = $range->split($start);
        $range = $base->split(strlen("span"));
        foreach($base->getNodes() as $node)
        {
            $span = $doc->createElement('span');
            $span->setAttribute('class', 'search_hightlight');
            $node = $node->parentNode->replaceChild($span, $node);
            $span->appendChild($node);
        }
    }
}

echo $doc->saveXML(); // Output the modified XML with highlighted text
ログイン後にコピー

このアプローチ置換操作中に HTML タグを堅牢かつ効率的に無視できるため、HTML 構造を壊すことなく一貫した結果が保証されます。

以上が正規表現の置換中に HTML タグを効率的に無視するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート