PHP 保持大小写的正则表达式替换主题
PHP Regex Replace Subject while keeping case
我正在使用 preg_replace
交换 U.S。在 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
标志以匹配所有字母大小写,但是这会改变("Center" 到 "centre"),例如,这并不理想。
我可以向 $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
等...
我正在使用 preg_replace
交换 U.S。在 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
标志以匹配所有字母大小写,但是这会改变("Center" 到 "centre"),例如,这并不理想。
我可以向 $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
等...