タグを無視して HTML 内のキーワードを強調表示するにはどうすればよいですか?

Mary-Kate Olsen
リリース: 2024-11-12 22:40:02
オリジナル
916 人が閲覧しました

How to Highlight Keywords in HTML While Ignoring Tags?

preg_replace で HTML タグを無視する方法

コード スニペットでは、preg_replace を使用して HTML テキスト内で検索されたキーワードを強調表示しようとしています。ただし、このアプローチでは、キーワードが HTML タグ内のコンテンツと一致する場合、HTML 構造の破壊につながる可能性があります。

このタスクには、正規表現を使用する代わりに、XPath と DOMDocument を活用することをお勧めします。次のアプローチを検討してください:

  1. DOMDocument オブジェクトを作成します:loadXML を使用して HTML テキストを DOMDocument オブジェクトに解析します。
  2. 検索に DOMXPath を使用します: DOMXPath オブジェクトを作成し、それを使用して検索用語を含む要素をクエリします。
  3. 検索で HTML タグを無視します: //*[contains(., "{$search}")]/*[FALSE = contains(., "{$search}")]/.. HTML タグを除外しながら、検索テキストを含む親要素を識別します。
  4. 検索結果の処理: 一致するテキスト ノードを抽出し、それらを目的の で囲みます。
  5. 変更した HTML を保存します: 更新された DOMDocument を HTML 文字列に保存します。

コード例:

$str = '...'; // HTML String
$search = 'text that span';

$doc = new DOMDocument;
$doc->loadXML($str);
$xp = new DOMXPath($doc);

$anchor = $doc->getElementsByTagName('body')->item(0);
if (!$anchor) {
    throw new Exception('Anchor element not found.');
}

$r = $xp->query('//*[contains(., "'.$search.'")]/*[FALSE = contains(., "'.$search.'")]/..', $anchor);
if (!$r) {
    throw new Exception('XPath failed.');
}

foreach ($r as $i => $node) {
    $textNodes = $xp->query('.//child::text()', $node);
    $range = new TextRange($textNodes);
    while (FALSE !== $start = strpos($range, $search)) {
        $base = $range->split($start);
        $range = $base->split(strlen($search));
        $ranges[] = $base;
    }

    foreach ($ranges as $range) {
        foreach ($range->getNodes() as $node) {
            $span = $doc->createElement('span');
            $span->setAttribute('class', 'search_hightlight');
            $node = $node->parentNode->replaceChild($span, $node);
            $span->appendChild($node);
        }
    }
}

echo $doc->saveXML();
ログイン後にコピー

このアプローチにより、HTML タグを無視しながら検索語を効果的に強調表示でき、HTML コンテンツの構造的完全性を維持できます。

以上がタグを無視して HTML 内のキーワードを強調表示するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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