preg_replace에서 HTML 태그를 제외하는 방법
제공된 코드는 preg_replace를 사용하여 문자열 내의 검색 결과를 강조 표시하려고 시도합니다. 그러나 문자열에 HTML 태그가 있으면 교체 작업이 실수로 태그 자체에 태그를 지정하여 HTML 구조가 손상되므로 문제가 발생합니다.
해결책: DOM 기반 접근 방식 사용
정규 표현식은 HTML 구문 분석에 이상적인 도구가 아닙니다. 대신 DOM(Document Object Model) 및 DOMXPath를 사용하여 문자열의 XML 구조를 탐색하는 것이 좋습니다.
DOMXPath를 사용하면 XML 요소를 무시하고 특정 텍스트가 포함된 요소를 검색할 수 있습니다. 이를 통해 관련 텍스트 노드를 분리하고 원하는 범위 태그로 묶을 수 있습니다.
코드 구현
다음 코드는 이 접근 방식을 구현하는 방법을 보여줍니다.
$doc = new DOMDocument; $doc->loadXML($str); $xp = new DOMXPath($doc); // Search elements containing the search text $r = $xp->query('//*[contains(., "'.$search.'")]/*[FALSE = contains(., "'.$search.'")]/..', $anchor); // Process search results foreach($r as $i => $node) { // Extract search text nodes and create suitable nodes if necessary $range = new TextRange($xp->query('.//child::text()', $node)); $ranges = array(); while(FALSE !== $start = strpos($range, $search)) { $base = $range->split($start); $range = $base->split(strlen($search)); $ranges[] = $base; }; // Wrap matching text nodes 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); } } }
이 코드는 검색 텍스트가 포함된 요소를 검색하고 해당 요소가 포함되지 않은 하위 요소는 무시합니다. 검색 영역은 TextRange 개체로 표시되므로 일치하는 텍스트 주위에 범위 태그를 삽입할 수 있습니다. 결과는 HTML 구조를 손상시키지 않고 검색 결과가 강조 표시된 수정된 XML 문자열입니다.
위 내용은 구조를 깨지 않고 HTML에서 검색 결과를 강조하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!