PHP AJAX搜索功能使用stristr和substr

时间:2015-05-23 00:30:59

标签: php ajax

w3schools 上有一个关于PHP和AJAX的页面,它使用一个文本框来搜索一系列名称。

然而,他们使用的功能似乎很奇怪,因为;

  • 如果您搜索" Joh", Johanna 会弹出

  • 如果您搜索" An", Anna 会弹出

  • 如果您搜索" Johanna", Anna,Johanna 弹出

  • 但如果您搜索" Johann",只会 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的底部 也可以自由测试搜索框,以便您能够理解我正在进一步说的内容。

4 个答案:

答案 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,但不会返回其他任何一个,