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