Подтвердить что ты не робот

Как сделать регистр поиска в Xpath нечувствительным

В настоящее время я делаю xpath-поиск, у меня есть поиск, но мне нужно сделать регистр нечувствительным. Файл xml, который я использую, является 1.0, который из моего исследования означает, что я должен использовать какую-то вещь, называемую функцией перевода, но я не уверен, как это сделать.

Вот мой файл поиска:

$holidayDoc = simplexml_load_file('holidays.xml');      

// fetch data from form
$txtSearch = $_GET['txtSearch'];

$qry = "//channel/item[contains(.,\"$txtSearch\")]";


$holidays = $holidayDoc->xpath($qry);   // do the xpath query 
// now loop through all the students

echo "Showing title search results for $txtSearch";

foreach ($holidays as $holiday) 
{

 echo "<p><a href=\"{$holiday->link}\">{$holiday->title}</a></p>
    <p><small>$holiday->pubDate</small></p>";

Любая помощь будет очень благодарна.

4b9b3361

Ответ 1

XPath 1.0:

$qry = "//channel/item[contains(
 translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'),  
 translate($search, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'))]"

XPath 2.0:

$qry = "//channel/item[lower-case(.) = lower-case($search)]"

Оба заменяют весь верхний регистр на нижний регистр.

Ответ 2

Нынешний принятый ответ ошибочен - потому что ничего не гарантирует, что второй аргумент contains() уже преобразован в нижний регистр.

Кроме того, он использует '$search' - и это буквально строка "$search" - не переменная $search.

Вот правильное решение:

//channel/item
   [contains(translate(., 
                       'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 
                       'abcdefghjiklmnopqrstuvwxyz'),
             translate($txtSearch, 
                       'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 
                       'abcdefghjiklmnopqrstuvwxyz')
             )
   ]

Соответствующее выражение XPath 2.0:

//channel/item[contains(lower-case(.), lower-case($txtSearch))]

Обновление

Основываясь на этом решении, @alain.janinm исправил свой ответ.

Ответ 3

Технически, чтобы сделать скверно-слепое сравнение, вы должны использовать сортировку в случайном порядке, если только ваш текст не является английским; нормализация обоих операндов в верхний регистр или нижний регистр не дает правильного результата при любых обстоятельствах. К сожалению, имена сопоставлений (в XPath 2.0) не стандартизированы, поэтому вам нужно посмотреть в документации по продукту, чтобы узнать, какие сопоставления доступны.

Ответ 4

Нечувствительный к регистру поиск может использоваться с использованием функции matches, подобной

$qry = "//string[text() [matches(.,'^stringImTryingToFind$','i')]]"

В разделе //string[text() [matches(.,'^OK$','i')]] запроса используются регулярные выражения (REGEX) для определения соответствия.