>  기사  >  백엔드 개발  >  태그를 무시하면서 HTML에서 키워드를 강조하는 방법은 무엇입니까?

태그를 무시하면서 HTML에서 키워드를 강조하는 방법은 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-11-12 22:40:02946검색

How to Highlight Keywords in HTML While Ignoring Tags?

preg_replace에서 HTML 태그를 무시하는 방법

코드 조각에서 preg_replace를 사용하여 HTML 텍스트 내에서 검색된 키워드를 강조 표시하려고 합니다. 그러나 이 접근 방식은 키워드가 HTML 태그 내의 콘텐츠와 일치할 때 HTML 구조가 중단될 수 있습니다.

이 작업에는 정규 표현식을 사용하는 대신 XPath 및 DOMDocument를 활용하는 것이 좋습니다. 다음 접근 방식을 고려하십시오.

  1. DOMDocument 객체 생성: loadXML을 사용하여 HTML 텍스트를 DOMDocument 객체로 구문 분석합니다.
  2. 검색에 DOMXPath를 사용합니다. DOMXPath 객체를 생성하고 이를 사용하여 검색이 포함된 요소를 쿼리합니다. term.
  3. 검색에서 HTML 태그 무시: //*[contains(., "{$search}")]/*[FALSE = contain(., "{$search}")]/.. HTML 태그를 제외하고 검색 텍스트를 포함하는 상위 요소를 식별합니다.
  4. 검색 처리 결과: 일치하는 텍스트 노드를 추출하고 원하는 태그를 동적으로 저장합니다.
  5. 수정된 HTML 저장: 업데이트된 DOMDocument를 HTML 문자열에 다시 저장합니다.

코드 예:

$str = '...'; // HTML String
$search = 'text that span';

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

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

foreach ($r as $i => $node) {
    $textNodes = $xp->query('.//child::text()', $node);
    $range = new TextRange($textNodes);
    while (FALSE !== $start = strpos($range, $search)) {
        $base = $range->split($start);
        $range = $base->split(strlen($search));
        $ranges[] = $base;
    }

    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);
        }
    }
}

echo $doc->saveXML();

이 접근 방식을 사용하면 HTML 태그를 무시하면서 검색어를 효과적으로 강조할 수 있습니다. HTML 콘텐츠의 구조적 무결성을 유지합니다.

위 내용은 태그를 무시하면서 HTML에서 키워드를 강조하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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