这里有一些错误:使用and
代替or
,假设搜索不区分大小写,并将错误数量的参数传递给contains
。如果您正在寻找它们,最后一个会触发 PHP 警告。此外,您只会返回您搜索的最后一个项目。
XPath 1.0 中不区分大小写的搜索 https://stackoverflow.com/questions/41394579/how-do-i-make-xpath-1-0-query-case-insensitive(这是所有 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;
}