PHP实现地址关键词有序匹配:验证关键词顺序正确性
按顺序匹配地址关键词的实现方法
方法一:使用正则表达式
既然你已经完成了文本转小写、替换特殊字符的处理,可以直接基于处理后的字符串构建正则规则,确保搜索关键词按顺序出现(中间允许插入任意内容)。
具体思路是:将$SearchAddress按空格拆分成单个关键词,用.*?(非贪婪匹配任意字符)连接这些关键词,形成正则模式,以此保证关键词的顺序性。
代码示例:
// 假设已完成转小写、替换特殊字符的预处理 $MyAddress = strtolower("210, street Cardinal Avenue, Canada"); $SearchAddress = strtolower("210 Cardinal Avenue"); // 将搜索词拆分为关键词数组 $keywords = explode(' ', trim($SearchAddress)); // 构建正则模式:转义关键词特殊字符,并用非贪婪匹配连接 $pattern = '/' . implode('.*?', array_map('preg_quote', $keywords)) . '/'; // 执行匹配 $isMatch = preg_match($pattern, $MyAddress) === 1; var_dump($isMatch); // 输出 bool(true) // 测试反向顺序的情况 $SearchAddressReverse = strtolower("210 Avenue Cardinal"); $keywordsReverse = explode(' ', trim($SearchAddressReverse)); $patternReverse = '/' . implode('.*?', array_map('preg_quote', $keywordsReverse)) . '/'; $isMatchReverse = preg_match($patternReverse, $MyAddress) === 1; var_dump($isMatchReverse); // 输出 bool(false)
说明:
preg_quote用于转义关键词中的正则特殊字符(如.、*),避免干扰匹配逻辑.*?是非贪婪匹配,会尽可能少地匹配字符,防止跳过后续关键词preg_match返回1表示匹配成功,0表示匹配失败
方法二:非正则的顺序匹配法
如果对正则语法不太熟悉,也可以用字符串查找的方式实现顺序匹配,逻辑更直观:
- 将搜索词拆分为关键词数组
- 依次在地址中查找每个关键词,每次查找的起始位置必须在上一个关键词的结束位置之后
- 若所有关键词都按顺序找到,则返回
true
代码示例:
// 假设已完成转小写、替换特殊字符的预处理 $MyAddress = strtolower("210, street Cardinal Avenue, Canada"); $SearchAddress = strtolower("210 Cardinal Avenue"); $keywords = explode(' ', trim($SearchAddress)); $currentPosition = 0; $isMatch = true; foreach ($keywords as $keyword) { // 从当前位置开始查找关键词 $pos = strpos($MyAddress, $keyword, $currentPosition); if ($pos === false) { $isMatch = false; break; } // 更新查找起始位置为当前关键词的结束位置 $currentPosition = $pos + strlen($keyword); } var_dump($isMatch); // 输出 bool(true) // 测试反向顺序 $SearchAddressReverse = strtolower("210 Avenue Cardinal"); $keywordsReverse = explode(' ', trim($SearchAddressReverse)); $currentPositionReverse = 0; $isMatchReverse = true; foreach ($keywordsReverse as $keyword) { $pos = strpos($MyAddress, $keyword, $currentPositionReverse); if ($pos === false) { $isMatchReverse = false; break; } $currentPositionReverse = $pos + strlen($keyword); } var_dump($isMatchReverse); // 输出 bool(false)
内容的提问来源于stack exchange,提问作者Yannick Pavard
相关产品推荐
相关产品推荐

