>백엔드 개발 >PHP 튜토리얼 >HTML 태그를 무시하면서 HTML 콘텐츠에서 검색 및 바꾸기를 수행하는 방법은 무엇입니까?

HTML 태그를 무시하면서 HTML 콘텐츠에서 검색 및 바꾸기를 수행하는 방법은 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-11-16 16:42:031039검색

How to Perform Search and Replace on HTML Content While Ignoring HTML Tags?

preg_replace에서 HTML 태그 무시

preg_replace를 사용하여 HTML이 포함된 문자열에 대해 검색 및 바꾸기 작업을 수행할 때 HTML 태그를 무시하고 수정만 하는 것이 바람직한 경우가 많습니다. 실제 텍스트 내용. 그러나 정규 표현식만으로는 HTML 구문 분석에 적합하지 않기 때문에 이는 어려울 수 있습니다.

한 가지 대안 접근 방식은 DOMDocument 및 DOMXPath를 활용하여 HTML 구조를 처리하는 것입니다. XPath 쿼리를 활용하면 HTML 문서 내에서 검색 기준과 일치하는 텍스트 노드를 찾은 다음 나머지 HTML 태그에 영향을 주지 않고 해당 노드를 원하는 HTML 요소로 래핑할 수 있습니다.

예를 들어, HTML 태그 간섭을 방지하는 다음 코드 조각을 고려하십시오.

$str = '...'; // HTML document

$search = 'text to highlight';

$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.');
}

// XPath query to locate text nodes containing the search text
$r = $xp->query('//*[contains(., "'.$search.'")]/*[FALSE = contains(., "'.$search.'")]/..', $anchor);
if (!$r) {
    throw new Exception('XPath failed.');
}

// Process search results
foreach($r as $i => $node) {
    $textNodes = $xp->query('.//child::text()', $node);
    $range = new TextRange($textNodes);

    // Identify matching text node ranges
    $ranges = array();
    while (FALSE !== $start = $range->indexOf($search)) {
        $base = $range->split($start);
        $range = $base->split(strlen($search));
        $ranges[] = $base;
    }

    // Wrap matching text nodes with HTML elements
    foreach($ranges as $range) {
        foreach($range->getNodes() as $node) {
            $span = $doc->createElement('span');
            $span->setAttribute('class', 'search_highlight');
            $node = $node->parentNode->replaceChild($span, $node);
            $span->appendChild($node);
        }
    }
}

echo $doc->saveHTML();

이 코드는 XPath 쿼리를 활용하여 검색어가 포함된 텍스트 노드를 찾은 다음 TextRange 클래스를 생성하여 텍스트 노드 내의 하위 범위를 관리합니다. 그런 다음 각 일치 범위는 강조 표시나 다른 목적으로 사용할 수 있는 사용자 정의 클래스가 있는 범위 요소 내에 래핑됩니다.

정규 표현식에만 의존하는 대신 DOMDocument 및 DOMXPath를 사용함으로써 이 접근 방식은 보다 효율적인 HTML 콘텐츠에 대한 검색 및 바꾸기 작업을 수행할 때 HTML 태그를 무시하는 안정적인 방법입니다.

위 내용은 HTML 태그를 무시하면서 HTML 콘텐츠에서 검색 및 바꾸기를 수행하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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