【发布时间】: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;
}
【问题讨论】: