在 w3schools 上有一个关于PHP和AJAX的页面,它使用一个文本框来搜索一系列名称。
然而,他们使用的功能似乎很奇怪,因为;
如果您搜索" Joh", Johanna 会弹出
如果您搜索" An", Anna 会弹出
如果您搜索" Johanna", Anna,Johanna 弹出
这看起来很奇怪,因为我读了PHP文档,而stristr函数在hastack方法中使用了一个针来检测是否可以在另一个中找到一个字符串,而在这个搜索框中你不必搜索它的整个字符串可以在上面找到。
有人可以解释第二个if语句如何搜索字符串。我理解其余的。 - 来自 w3schools
$q = $_REQUEST["q"];
$hint = "";
// lookup all hints from array if $q is different from ""
if ($q !== "") {
$q = strtolower($q);
$len=strlen($q);
foreach($a as $name) {
if (stristr($q, substr($name, 0, $len))) {
if ($hint === "") {
$hint = $name;
} else {
$hint .= ", $name";
}
}
}
}
// Output "no suggestion" if no hint was found or output correct values
echo $hint === "" ? "no suggestion" : $hint;
此处无法粘贴整个代码。但是,如果有必要,它全部位于 w3schools HERE的底部 也可以自由测试搜索框,以便您能够理解我正在进一步说的内容。
答案 0 :(得分:0)
if (stristr($q, substr($name, 0, $len))) { //this if condition to look for string $q's first occurence in string $name
if ($hint === "") { //this if condition is for when the foreach loop executes for the first time, there is no value in $hint, to assign that value we execute this if condition
$hint = $name;
} else {
$hint .= ", $name"; // for rest of the foreach loops this else condition will only execute
}
}
答案 1 :(得分:0)
这里发生的事情是使用stristr的代码未正确使用,或者您直观地预期。
正确的解决方案是像这样切换干草堆和针:
if (stristr($name,$q))
虽然它仍然会保持模糊性。可能正确的方法是使用正则表达式函数,如preg_match,并从字符串的开头搜索匹配。
答案 2 :(得分:0)
foreach($a as $name)
该行从$ name变量
中逐个获取数组$ a []中的每个值 if (stristr($q, substr($name, 0, $len)))`
如果内部表达式为true,则此行返回正返回值。当输入的文本($ q)可供搜索时,该行将返回。如果$ q的字母起始长度的子字符串不相等,那么将返回负值,因此if语句将不会执行。
答案 3 :(得分:0)
摘要 发生这种情况是因为stristr从字符串的开头开始,从左到右进行搜索,并试图将数据库中的名称与用户输入的内容进行匹配,这受到用户输入的字符数的限制。
详细响应 stristr正在搜索大海捞针,该大海捞针是用户以HTML形式输入的查询($ q),用于寻找针脚,即正在循环通过的数组的值($ a-在gethint.php中定义)。>
if (stristr($q, substr($name, 0, $len)))
因此stristr在用户输入的查询字符串($ q)中搜索名称(从gethint.php中的$ a数组)。但是stristr不是在搜索全名,它的搜索受substr限制。 Substr设置为返回它在$ name条目中找到的所有字符(0),受用户在查询字符串$ q中输入的字符数限制。
请参见http://www.php.net/manual/en/function.substr.php
echo substr('abcdef', 0, 8); // abcdef
echo substr('abcdef', 0, 4); // abcd
当用户键入“ Johan”时,$ a的名称数组中将有一个匹配的Johan,因此满足if条件并执行以下语句:将$ hint设置为整个$ a条目($ name)(即Johanna)。这很重要,因为它可以阻止“ Jos”返回“ Johanna”。除非键入的内容与数组中的内容完全匹配,否则它不会返回任何内容。
if ($hint === "") {
$hint = $name;
} else {
$hint .= ", $name";
}
当用户键入“ Johann”时,$ a数组中唯一的匹配项是Johann,但是当他们键入“ Johanna”时,存在两个匹配项,分别是“ Johanna”和“ Anna”。
为进一步说明这一点,假设我输入了“ Ravig”,其中包含的数组为:
Avi
Ravi
Raviel
Ravigdor
Ravishy
这将返回Avi,Ravi和Ravigdor,但不会返回其他任何一个,