代码之家  ›  专栏  ›  技术社区  ›  yevg

PHP正则表达式在保留大小写的同时替换主题

  •  1
  • yevg  · 技术社区  · 6 年前

    preg_replace

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

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

    1 回复  |  直到 6 年前
        1
  •  1
  •   AbraCadaver    6 年前

    如果我有更多的时间,可能会有一个更优雅的解决方案,但这是一个开始:

    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