Идея состоит в том, чтобы создать ассоциативный массив ($pairs
) со словами в качестве ключей и переводами в качестве значений, а затем создать шаблон поиска со всеми словами в чередовании:
$string = "Red Cell is very good. Condition is new. But nobody buys it.";
$words = ["Red Cell", "Condition", "no", "Red", "new"];
$translations = ["Red Cell", "Stav", "ne", "Červený", "nový"];
$pairs = array_combine($words, $translations);
krsort($pairs);
$pattern = '~\b(?:' . implode('|', array_keys($pairs)) . ')\b~u';
$result = preg_replace_callback($pattern, function ($m) use ($pairs) {
return $pairs[$m[0]];
}, $string);
echo $result;
demo
Чтобы убедиться, что самая длинная строка проверяется первой (например, между "Red Cell" и "Red"), слова в шаблоне сортируются в обратном порядке.
Преимущество preg_replace_callback
с одним шаблоном и параметрами замены перед str_replace
с массивами состоит в том, что строка обрабатывается только один раз, когда str_replace
будет анализировать всю строку один раз для слова (это предотвращает циклические замены),Кроме того, поскольку параметр поиска является шаблоном регулярных выражений, вы можете использовать границы слов, чтобы быть уверенным, что слово не вырезано в середине.