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

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

1

Решение

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

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 так далее…

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector