Помогите с 2 ошибками, используя DOMDocument для разбора HTML - PullRequest
0 голосов
/ 02 февраля 2011

Когда я запускаю функцию decorate_keyword () ниже, я получаю две ошибки, которые пытаюсь устранить.Первое, кажется, легче всего решить.Я получаю ...

Предупреждение: DOMXPath :: query () [domxpath.query]: недопустимое выражение в C: \ xampplite \ htdocs \ testsite \ wp-content \ plugins \ myplugin \index.php в строке 48

Указывает на строку $ node в функции и, по-видимому, происходит из переменной $ keyword, когда она содержит пустое пространство.$ keyword = "test" не выдает ошибку.Что мне нужно изменить, чтобы преодолеть эту ошибку?

function rseo_decorate_keyword($postarray) {
    $keyword = "test";
    $content = $postarray['post_content'];
    /* 
     even though I can echo $content and get a string, 
     I'm getting error: Empty string supplied in loadHTML() when I use this. 
     so, I have to explicity set it to a string as below to test.
   */
    $content = "this is a test phrase";
    $d = new DOMDocument();
    $d->loadHTML($content);
    $x = new DOMXpath($d);
    $nodes = $x->query("//text()[contains(.,$keyword) and not(ancestor::h1) and not(ancestor::h2) and not(ancestor::h3) and not(ancestor::h4) and not(ancestor::h5) and not(ancestor::h6)]");
    if ($nodes && $nodes->length) {
        $node = $nodes->item(0);
        // Split just before the keyword
        $keynode = $node->splitText(strpos($node->textContent, $keyword));
        // Split after the keyword
        $node->nextSibling->splitText(strlen($keyword));
        // Replace keyword with <b>keyword</b>
        $replacement = $d->createElement('b', $keynode->textContent);
        $keynode->parentNode->replaceChild($replacement, $keynode);
    }
     $postarray['post_content'] = $d;
return $postarray;
}

1 Ответ

0 голосов
/ 02 февраля 2011

Функция XPath contains должна иметь второй аргумент в кавычках, если она содержит различные символы, например ;&,.Пробел является одним из них.

$nodes = $x->query("//text()[contains(.,'$keyword') and not(ancestor::h1) and not(ancestor::h2) and not(ancestor::h3) and not(ancestor::h4) and not(ancestor::h5) and not(ancestor::h6)]");

По вашей ошибке mysql_real_escape_string по какой-то причине передается объект, а не строка.Я не знаком с внутренностями Wordpress: вы должны задать отдельный вопрос с соответствующими тегами.

...