【问题标题】:PHP keyword highlighting using DOM使用 DOM 突出显示 PHP 关键字
【发布时间】:2023-03-13 20:25:01
【问题描述】:

我使用Highlight keywords in a paragraph 中的以下函数来突出显示字符串中的关键字。因此它会产生这个警告:

Warning: DOMDocument::loadHTML() [domdocument.loadhtml]: htmlParseEntityRef: expecting ';' in Entity, line: 1 in /../ on line 118

在此线程Warning: DOMDocument::loadHTML(): htmlParseEntityRef: expecting ';' in Entity, 之后,答案建议使用 html 实体编码,但这样做会错过使用 DOM 搜索字符串并在不破坏标签的情况下突出显示的全部目的。例如。 htmlentities 和 html_entity_decode 会突出显示所有出现的事件。

我应该如何解决这个问题?还是我缺少的功能有其他问题?

function highlight($string,$query){
    $keywords = explode(" ",$query);
    //define
    $keywordsCIS = array();
    foreach($keywords as $value){
        $lcValue = strtolower($value);
        $keywordsCIS[] = $value;
        $keywordsCIS[] = $lcValue;
        $keywordsCIS[] = ucfirst($lcValue);
        $keywordsCIS[] = strtoupper($lcValue);
    }
    $dom = new DomDocument();
    $dom ->recover = true;
    $dom -> strictErrorChecking = false;
    $dom -> loadHtml($string);
    $xpath = new DomXpath($dom);
    foreach ($keywordsCIS as $keyword) {
        $elements = $xpath->query('//*[contains(.,"' . $keyword . '")]');
        foreach ($elements as $element) {
            foreach ($element->childNodes as $child) {
                if (!$child instanceof DomText) continue;
                $fragment = $dom->createDocumentFragment();
                $text = $child->textContent;
                $stubs = array();
                while (($pos = stripos($text, $keyword)) !== false) {
                    $fragment->appendChild(new DomText(substr($text, 0, $pos)));
                    $word = substr($text, $pos, strlen($keyword));
                    $highlight = $dom->createElement('strong');
                    $highlight->appendChild(new DomText($word));
                    $highlight->setAttribute('class', 'kw');
                    $fragment->appendChild($highlight);
                    $text = substr($text, $pos + strlen($keyword));
                }
                if (!empty($text)) $fragment->appendChild(new DomText($text));
                $element->replaceChild($fragment, $child);
            }
        }
    }
    //$string = $dom->saveXml($dom->getElementsByTagName('body')->item(0)->firstChild);
    $string = $dom->saveHTML();
    return $string;
}

【问题讨论】:

    标签: php dom


    【解决方案1】:

    我相信您收到的警告来自 DomDocument 试图解析的 html。我假设您实际上并不希望在解析之前更改正在解析的$string 中的 html 内容。

    尝试在 loadHTML 行上使用 @ operator 以避免警告:

    @$dom->loadHtml($string);
    

    【讨论】:

      【解决方案2】:

      例如,如果您的 HTML 包含 this & that,或任何其他带有 & 的内容,则解析器将查找实体。它真的应该是&。这也适用于 HTML 验证。

      您可以忽略 @$dom->loadHTML($string); 的错误,在这种情况下不会有太大问题。也就是说,在使用这样的解析器时,您应该小心正确地格式化您的 HTML。

      【讨论】:

        猜你喜欢
        • 2012-03-09
        • 2016-06-16
        • 2017-10-18
        • 2012-02-10
        • 2017-10-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-23
        相关资源
        最近更新 更多