php - 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'];
但是,它用“帽子”代替了字符串,而不是“汽车零件”
解决方案
如果$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
推荐阅读
- git - 在 CentOS 服务器上安装作曲家时,无法使用 Git 读取私有仓库
- angular - 如何判断组件是否用作 MatFormField
- node.js - Mongodb,解析一个变量作为查询条件
- unity3d - Agora Unity SDK,我无法静音取消静音用户音频/视频
- java - Spring Boot JdbcTemplate - 禁用语句缓存?
- python - 当我的机器人或其他机器人在命令中使用时,如何让我的机器人说话?(discord.py)
- python-3.x - 如何让 AWS cognito 刷新令牌到期?
- python - 打印 eval 无法从字符串打印变量
- r - 使用正则表达式选择性地提取 R 中的子字符串
- html - 过滤字段而不在 Directus 中搜索 HTML 标记