Как сделать регистр поиска в 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>";
Любая помощь будет очень благодарна.
Ответы
Ответ 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) для определения соответствия.