Сравнение текста без учета регистра () с DOMdocument? - PullRequest
1 голос
/ 02 февраля 2011

Как я могу сделать сравнение без учета регистра по ключевому слову в моем содержании в приведенном ниже сценарии?

Если я использую это ...

$keyword = strtolower(rseo_getKeyword($post));

$nodes = $x->query("//text()[
    contains(
    translate(.,'ABCDEFGHJIKLMNOPQRSTUVWXYZ',
                'abcdefghjiklmnopqrstuvwxyz'),
                '$keyword')

Замена производится только при совпадении ключевых слов в содержании, которое уже является строчным. Похоже, он не выполняет поиск без учета регистра.

    $keyword = rseo_getKeyword($post);
    $content = $postarray['post_content']; //error: Empty string supplied in loadHTML() when I use this.
    //$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);
    }
    echo $d->saveHTML();die;

Ответы [ 2 ]

2 голосов
/ 03 февраля 2011
//text()
    [contains(translate(.,'ABCDEFGHJIKLMNOPQRSTUVWXYZ',
                        'abcdefghjiklmnopqrstuvwxyz'),                 
              '$keyword') 
    ] 

Правильное выражение должно проверять, содержит ли текст в нижнем регистре ключевое слово в нижнем регистре :

//text()
    [contains(translate(.,'ABCDEFGHJIKLMNOPQRSTUVWXYZ',
                          'abcdefghjiklmnopqrstuvwxyz'),                 
              translate('$keyword','ABCDEFGHJIKLMNOPQRSTUVWXYZ',
                                   'abcdefghjiklmnopqrstuvwxyz')                 
              ) 
    ] 
1 голос
/ 02 февраля 2011

Функция text() возвращает все дочерние текстовые узлы узла контекста. Когда вы вызываете его как параметр для translate(), узел контекста является текстовым узлом и поэтому не имеет дочерних узлов текстового узла. Вместо этого используйте ., чтобы правильно выбрать сам контекстный узел, как вы действительно хотите.

Замените свою попытку:

contains(translate(text(), 'ABC…

с

contains(translate(., 'ABC…
...