【问题标题】:preg_replace match exact wordpreg_replace 匹配精确词
【发布时间】:2020-12-18 09:00:41
【问题描述】:

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

$string = "fuel cap for car";

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

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

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

表格

原文:汽车|摩托车|汽车|汽车 零件|活塞|摩托车|摩托车用金属油箱盖 替换:汽车配件

原件:帽子|棒球帽|帽子|无檐小便帽 替换:帽子

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

代码是:

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

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

【问题讨论】:

  • 如果需要完全匹配,可以使用str_replace。不需要正则表达式。
  • 您的代码不应该先将cap 替换为hat,然后将fuel hat for car 留给您吗?然后,当它试图找到 fuel cap for car 时,它将失败,将您的最终字符串保留为 fuel hat for car
  • 我的回答有帮助吗?

标签: php regex preg-replace


【解决方案1】:

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

PHP demo

$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

【讨论】:

    猜你喜欢
    • 2018-11-12
    • 2023-03-30
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-21
    • 2019-08-09
    • 2015-08-02
    相关资源
    最近更新 更多