正規表現置換での 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 サイトの他の関連記事を参照してください。