Несколько ошибок здесь: используйте and
вместо or
, предполагая, что поиск нечувствителен к регистру, и передавая неверное количество параметров в contains
. Последнее вызвало бы появление предупреждений PHP, если бы вы их искали. Кроме того, вы возвращаете только последний найденный элемент.
Поиск без учета регистра в XPath 1.0 (который поддерживается всеми PHP) - огромная проблема:
$result = $xml->query(
"//playlist/item[(songtitle[contains(translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), '{$word}')]) or (genre[contains(translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), '{$word}')])]"
);
Предполагается, что вы взяли условия поиска и преобразовали их в нижний регистр. Например:
<?php
function searchSong($xpath, ...$words)
{
$return = [];
foreach($words as $word) {
$word = strtolower($word);
$q = "//playlist/item[(songtitle[contains(translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), '{$word}')]) or (genre[contains(translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), '{$word}')])]";
$result = $xpath->query($q);
foreach($result as $node) {
$return[] = $node;
}
}
return $return;
}