php - PHP Regex 在保持大小写的同时替换主题
问题描述
我正在用preg_replace
HTML 中的英式变体交换美国单词。
function makeUK(&$str){
$delta = [
'authorize' => 'authorise',
'center' => 'centre',
'theater' => 'theatre',
'capitalize' => 'capitalise',
...
];
$pattern = []; $replacement = [];
foreach ($delta as $k => $val) {
// match terms using word boundaries excluding "-" character
$pattern[] = '/\b(?<!\-)'.$k.'\b(?!-)/i';
$replacement[] = $val;
}
return preg_replace($pattern,$replacement,$str);
}
它有点粗糙,但适合我的用例。
我i
在我的模式中设置了标志以匹配所有字母大小写,但是这会转换(例如,“中心”到“中心”),这并不理想。
我可以向数组添加额外的值来$delta
解释大写的单词"Center" => "Centre"
,但这会使数组的大小加倍并且维护起来很痛苦。
我调查了preg_replace_callback
但在为值数组而不是单个值实现它时遇到了麻烦。
有没有办法在保持所有小写值数组的同时保留匹配中的字母大小写?
解决方案
如果我有更多时间,可能会有更优雅的解决方案,但这是一个开始:
foreach ($delta as $k => $v) {
$pattern = '/\b(?<!\-)('.$k.')\b(?!-)/i';
$result = preg_replace_callback($pattern,
function($m) use($v){
return (ucfirst($m[1]) == $m[1]) ? ucfirst($v) : $v;
}, $str);
}
这不会考虑所有大写或混合情况,例如AUTHORIZE
等等authORize
......
推荐阅读
- json - 使用 xslt 将 json 转换为 csv
- rust - 在 Rust 中具有变量阴影的堆栈分配内存会发生什么?
- javascript - 如何停止未定义以停止在评分计算器中弹出
- amazon-web-services - 什么 AWS EC2 实例最适合设置需要处理许多连接和许多小消息的 socket.io websocket?
- timezone - GMail API 一天的使用限制是在哪个时区计算的?
- nginx - Nginx反向代理到Yesod转发的IP地址不起作用
- c++ - 查找由数组的数字组成的最大数字
- r - 使用分隔符将多列连接到新列 Spark R 数据框
- jquery - Jquery:检查表单是否已经提交并验证
- salesforce - Salesforce 表名称