PHP Regex Заменить тему, сохраняя регистр - PullRequest
0 голосов
/ 19 декабря 2018

Я использую 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, но у меня возникли проблемы с его реализацией для массивов значений, а не отдельных значений.

Есть ли способ сохранить регистр букв в совпадении при сохранении массива всех значений нижнего регистра?

1 Ответ

0 голосов
/ 19 декабря 2018

Если бы у меня было больше времени, могло бы быть более элегантное решение, но вот начало:

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 и т. Д....

...