PHP strpos实现搜索框异常:输入完整名称无结果的问题求助
问题分析与解决方案
嘿,我一眼就看出问题出在哪了——这是PHP里strpos()函数的一个经典“坑”!
当你输入完整名称比如"Jane"时,strpos($value["name"], "Jane")会返回0(因为匹配的位置是字符串的起始索引,PHP里字符串索引从0开始)。但在你的条件判断里,0会被PHP的松散比较当成false处理,导致这个匹配结果被忽略,自然搜不到内容;而输入"ane"时,strpos()返回1(非零的真值),条件判断通过,所以能正常出结果。
修复方法
你只需要把strpos()的判断改成**严格不等于false**就行——因为strpos()只有完全找不到匹配时才会返回false,找到匹配时返回的是起始索引(包括0)。修改server.php里的判断逻辑:
// 原错误判断 if (strpos($value["name"], $searchText) || strpos($value["surname"], $searchText)){ // 修改后的正确判断 if (strpos($value["name"], $searchText) !== false || strpos($value["surname"], $searchText) !== false){
完整修改后的server.php代码
<?php class Search { function __construct(){ $this->arr = [["name" => "Jane", "surname" => "Brown", "img" => "img/manager-1.png"], ["name" => "Bob", "surname" => "Crown", "img" => "img/Business-Man-Clipart-PNG-Image.png"], ["name" => "Mike", "surname" => "Ford", "img" => "img/lending-img.png"]]; $this->searchResult = []; if ($_SERVER["REQUEST_METHOD"] == "POST") { $searchText = $_POST["value"]; if (strlen($searchText) != 0){ foreach ($this->arr as $value) { // 核心修改点:用严格比较判断是否找到匹配 if (strpos($value["name"], $searchText) !== false || strpos($value["surname"], $searchText) !== false){ $this->searchResult[] = $value; } } } print json_encode($this->searchResult); } } } $x = new Search; ?>
补充说明
- 为什么
stristr()没问题?因为它返回的是匹配到的子字符串(找不到才返回false),当匹配开头时会返回整个字符串(非空值,视为真值),所以松散判断不会出错。 - 以后用
strpos()、stripos()这类返回索引的函数时,一定要记得用严格比较(!== false或=== false),避免索引0被误判为假值的情况。
内容的提问来源于stack exchange,提问作者Narek
相关产品推荐
相关产品推荐

