You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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表示匹配失败

方法二:非正则的顺序匹配法

如果对正则语法不太熟悉,也可以用字符串查找的方式实现顺序匹配,逻辑更直观:

  1. 将搜索词拆分为关键词数组
  2. 依次在地址中查找每个关键词,每次查找的起始位置必须在上一个关键词的结束位置之后
  3. 若所有关键词都按顺序找到,则返回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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 01:10:26