В настоящее время я делаю 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>";
Любая помощь будет с благодарностью благодарна.
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)]"
Оба заменят весь верхний регистр на нижний.
Технически, чтобы сделать случайное слепое сравнение, вы должны использовать сортировку в случайном порядке, если только ваш текст не является английским; нормализация обоих операндов в верхний регистр или нижний регистр не дает правильного результата при любых обстоятельствах. К сожалению, имена сопоставлений (в XPath 2.0) не стандартизированы, поэтому вы должны посмотреть в документации по продукту, чтобы узнать, какие сопоставления доступны.
Принимаемый в настоящее время ответ ошибочен – потому что ничто не гарантирует, что второй аргумент 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
исправил свой ответ.
Нечувствительный к регистру поиск может использоваться с использованием функции matches
$qry = "//string[text() [matches(.,'^stringImTryingToFind$','i')]]"
//string[text() [matches(.,'^OK$','i')]]
разделе запроса использует регулярные выражения (REGEX) для определения соответствия.