首页 > 解决方案 > preg_replace 匹配精确词

问题描述

我正在尝试使用 preg_replace 替换 PHP 中的单词。执行代码时,它将用“cap”代替“汽车燃料盖”,而不是“汽车零件”。

$string = "fuel cap for car";

$find = array('cap', 'fuel cap for car');
$replace = array('hat', 'auto parts');

echo preg_replace($find, $replace, $string);

所以,我已经尝试了另一种方法。我将原始值和替换值存储在数据库中,例如:

桌子

原件:汽车|摩托车|汽车|汽车零件|活塞|摩托车|摩托车金属油箱盖 替换:AUTO PARTS

原文:cap|baseball cap|hat|beanie 替换:HAT

字符串是:汽车的油箱盖。

代码是:

$result = mysqli_query($connect, $query);
    while($row2 = mysqli_fetch_assoc($result)){
if(preg_match('/\b'.$row[suggestions].'\b/i', $string)){
$string = $row['description'];

但是,它用“帽子”代替了字符串,而不是“汽车零件”

标签: phpregexpreg-replace

解决方案


如果$find数组不包含太多项,您可以通过从$find和数组创建关联数组$replace并从数组项构建单个正则表达式来解决该问题,即,一个包含单个组的正则表达式,其中所有字符串都列为备选,然后,在找到匹配项后,替换为相应的$replace值。

查看PHP 演示

$string = "fuel cap for car";

$find = array('cap', 'fuel cap for car');
$replace = array('hat', 'auto parts');
$arr = array_combine($find, $replace);
usort($find, function($a, $b) {          // Longer phrases must come first
    return strlen($b) - strlen($a);
});

echo preg_replace_callback('~\b(?:' . implode('|', $find) . ')\b~', function($x) use ($arr) {
    return $arr[$x[0]];
}, $string);
// => auto parts

推荐阅读