PHP地址字符串匹配异常:strpos两次返回false求助
问题
需要将数据库中的地址数据与新客户输入的地址进行比对,对字符串执行替换、转小写等处理后,使用strpos进行匹配时两次调用均返回false。
处理代码:
$result = "Südendstr. 13 a"; $healthy = array(" "); $yummy = array(""); $result = strval(strtolower(str_replace($healthy, $yummy, $result))); $healthy = array("strasse", "straße",".", "str" ); $yummy = array("str. ", "str. ","", "str. "); $result = strval(strtolower(str_replace($healthy, $yummy, $result))); $_customer['customer']['adress'] = "Südendstrasse"; $healthy = array(" "); $yummy = array(""); $_customer['customer']['adress'] = strval(strtolower(str_replace($healthy, $yummy, $_customer['customer']['adress'] ))); $healthy = array("strasse", "straße",".", "str" ); $_customer['customer']['adress'] = strval(str_replace($healthy, $yummy, $_customer['customer']['adress'] ));
处理后的值:
$result = "südendstr. 13a"$_customer['customer']['adress'] = "südendstr."
匹配代码:
$_strpos_1 = strpos($result, strval($_customer['customer']['adress'])); $_strpos_2 = strpos($_customer['customer']['adress'], $result);
两次strpos调用均返回false,请求排查原因。
问题排查与解决
核心原因
字符串匹配的空格差异
处理后$_customer['customer']['adress']的值是südendstr.(末尾无空格),但$result里对应部分是südendstr.(.后跟空格),两者字符不完全一致,所以strpos($result, "südendstr.")找不到匹配项,返回false。strpos调用逻辑错误$_strpos_2是用短字符串(客户地址)去匹配长字符串(数据库地址),逻辑上短字符串不可能包含更长的字符串,这调用本身就不合理,必然返回false。替换规则顺序引发的格式混乱
替换数组的执行顺序是strasse→straße→.→str,导致处理后的字符串引入了不必要的空格,且不同地址的标准化结果不一致:
- 数据库地址处理时,先把
.替换为空,再把str替换为str.,最终多出空格; - 客户地址处理时,把
strasse替换为str.,同样引入空格,但后续没有统一去除步骤,导致格式不统一。
修正方案
1. 统一地址标准化逻辑
复用函数处理地址,避免重复代码,同时统一替换规则,消除空格和格式差异:
function normalizeAddress($addr) { $addr = strtolower(trim($addr)); // 统一将所有街道后缀替换为无格式的"str" $replaceMap = [ 'straße' => 'str', 'strasse' => 'str', 'str.' => 'str', '.' => '', ' ' => '' ]; return strtr($addr, $replaceMap); } // 处理两个地址 $normalizedDbAddr = normalizeAddress("Südendstr. 13 a"); // 输出:südendstr13a $normalizedCustomerAddr = normalizeAddress("Südendstrasse"); // 输出:südendstr
2. 调整匹配逻辑
如果只需要验证街道前缀一致,可检查标准化后的地址是否包含前缀:
// 检查客户地址是否是数据库地址的前缀 $match = strpos($normalizedDbAddr, $normalizedCustomerAddr) === 0; // 或者拆分街道和门牌号分别比对,匹配更精准
3. 移除错误的strpos调用
直接删除$_strpos_2的调用,因为其逻辑完全错误,无法得到有效结果。
内容的提问来源于stack exchange,提问作者Thomas Henke
相关产品推荐
相关产品推荐

