preg_replace で HTML タグを無視する方法
コード スニペットでは、preg_replace を使用して HTML テキスト内で検索されたキーワードを強調表示しようとしています。ただし、このアプローチでは、キーワードが HTML タグ内のコンテンツと一致する場合、HTML 構造の破壊につながる可能性があります。
このタスクには、正規表現を使用する代わりに、XPath と DOMDocument を活用することをお勧めします。次のアプローチを検討してください:
コード例:
$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 サイトの他の関連記事を参照してください。