2011-02-02 2 views
1

Как я могу сделать нечувствительное к регистру сравнение внешнего вида ключевого слова в моем контенте в сценарии ниже?Нечувствительный к регистру текст() сравнение с DOMdocument?

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

$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

Довольно много дубликатов http://stackoverflow.com/questions/625986/how-can-i-use-xpath-to-perform-a-case-insensitive-search-and-support-non-english – rik

+0

@rik , Я попытался заменить маршрутизацию перевода на мой xquery (и обновил свой вопрос с этой информацией), но когда я это сделаю, замена не производится вообще. –

+0

Возможный дубликат [нечувствительный к регистру xpath поиск в php] (http://stackoverflow.com/questions/3238989/case-insensitive-xpath-searching-in-php/3240155#3240155) – Gordon

ответ

2
//text() 
    [contains(translate(.,'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 
         'abcdefghjiklmnopqrstuvwxyz'),     
       '$keyword') 
    ] 

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

//text() 
    [contains(translate(.,'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 
          'abcdefghjiklmnopqrstuvwxyz'),     
       translate('$keyword','ABCDEFGHJIKLMNOPQRSTUVWXYZ', 
            'abcdefghjiklmnopqrstuvwxyz')     
      ) 
    ] 
+0

+1. Полный и классический. Отсутствует золотой значок рядом :) – Flack

1

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

Заменить попробовать:

contains(translate(text(), 'ABC… 

с

contains(translate(., 'ABC… 
+0

Я изменил его в своем вопросе, но я все еще делаю что-то неправильно. Я получаю только совпадения, когда ключевое слово является строчным в содержимом. –

+0

@Scott B, возможно, представляет собой воспроизводимый пример, и мы можем двигаться оттуда. Ключевые слова верхнего/нижнего/MixEd в содержании прекрасно работают с небольшим фрагментом HTML, который я использовал, чтобы проверить отмеченные выше примечания. – salathe