首页 > 解决方案 > PHP Regex 在保持大小写的同时替换主题

问题描述

我正在用preg_replaceHTML 中的英式变体交换美国单词。

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但在为值数组而不是单个值实现它时遇到了麻烦。

有没有办法在保持所有小写值数组的同​​时保留匹配中的字母大小写?

标签: phpregexpreg-replacephp-7.1preg-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......


推荐阅读