>  기사  >  백엔드 개발  >  구조를 깨지 않고 HTML에서 검색 결과를 강조하는 방법은 무엇입니까?

구조를 깨지 않고 HTML에서 검색 결과를 강조하는 방법은 무엇입니까?

DDD
DDD원래의
2024-11-13 00:30:02516검색

How to Highlight Search Results in HTML Without Breaking the Structure?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.