Подсветка ключевых слов PHP с использованием DOM - PullRequest
0 голосов
/ 01 ноября 2011

Я использую функцию ниже, найденную в Подсветка ключевых слов в параграфе для выделения ключевых слов в строке.Таким образом, он генерирует это предупреждение:

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

После этой темы Предупреждение: DOMDocument :: loadHTML (): htmlParseEntityRef: Ожидает ';'в 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;
}

Ответы [ 2 ]

0 голосов
/ 03 ноября 2011

Если ваш HTML содержит, например, this & that или что-то еще с &, анализатор будет искать сущность. Это действительно должно быть &. Это относится и к проверке HTML.

Вы можете игнорировать ошибки с @$dom->loadHTML($string);, что в этом случае не будет большой проблемой. Тем не менее, вы должны быть осторожны, чтобы правильно форматировать ваш HTML при использовании такого парсера.

0 голосов
/ 02 ноября 2011

Я полагаю, что вы получаете предупреждение от html, которое Domdocument пытается проанализировать.Я предполагаю, что вы на самом деле не хотите изменять html-контент в $string, который анализируется перед анализом.

Попробуйте использовать оператор @ в строке loadHTML, чтобы избежать предупреждения:

@$dom->loadHtml($string);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...