>  기사  >  백엔드 개발  >  정규식 교체 중에 HTML 태그를 효율적으로 무시하는 방법은 무엇입니까?

정규식 교체 중에 HTML 태그를 효율적으로 무시하는 방법은 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-11-12 06:24:02248검색

How to Efficiently Ignore HTML Tags During Regular Expression Replacement?

정규식 대체에서 HTML 태그 무시

정규식은 복잡한 HTML 구문 분석 작업을 처리하기에 충분하지 않은 경우가 많으며, 특히 선택적으로 처리하는 경우에는 더욱 그렇습니다. 태그를 무시합니다. 대신 일반적으로 이러한 시나리오에는 DOMDocument 및 DOMXPath를 사용하는 것이 좋습니다.

DOMXPath 기반 접근 방식

교체를 수행하는 동안 HTML 태그를 무시하려면 DOMXPath를 사용하여 다음을 수행할 수 있습니다. 문서 내에서 텍스트 요소를 선택적으로 찾습니다. 예를 들어, 다음 쿼리는 검색어 "applespan"을 포함하는 모든 텍스트 노드를 찾습니다.

//*[contains(., "apple span")]/*[FALSE = contains(., "apple span")]/..

Creating a TextRange Class

그런 다음 사용자 정의 DOM 텍스트 노드 목록을 나타내기 위해 TextRange 클래스를 만들 수 있습니다. 이 클래스를 사용하면 이러한 텍스트 노드에서 단일 문자열인 것처럼 문자열 작업을 수행할 수 있습니다.

검색 결과 처리

일치하는 각 텍스트 노드 범위에 대해 < ;스팬> 요소를 생성하고 텍스트 노드 주위에 삽입하여 강조 표시할 수 있습니다. 이렇게 하면 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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