У меня есть XML-канал с английскими символами, которые мне нужно перевести на мой язык. Проблема в том, что он переводит не точные строки, а каждое похожее слово.
Есть ли способ перевести только полные строки, а не все внутри слов?
Пример:
$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ý"];
$string = str_replace($words, $translations, $string);
что я получаю:
Червены Келл очень хорош. Ставка пеvý. Но пеbody покупает его.
Что я хочу:
Красная ячейка очень хорош. Став — это новый. Но никто его покупает.
Есть ли способ перевести точные строки, а не все, что содержит эти слова?






Идея состоит в том, чтобы построить ассоциативный массив ($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;
Чтобы убедиться, что сначала проверяется самая длинная строка (например, между «Red Cell» и «Red»), слова в шаблоне сортируются в обратном порядке.
Преимущество preg_replace_callback с одним шаблоном и параметрами замены по сравнению с str_replace с массивами заключается в том, что строка обрабатывается только один раз, когда str_replace будет анализировать всю строку один раз для каждого слова (это предотвращает циклические замены). Кроме того, поскольку параметр поиска является шаблоном регулярного выражения, вы можете использовать границы слов, чтобы убедиться, что слово не обрезано посередине.
Спасибо за вашу помощь и ответ. В любом случае.. я нашел проблему, и я не могу ее решить. Буду рад любой подсказке. Когда дело доходит до перевода обычных предложений, таких как «аккумуляторы для чтения электронных книг», проблем не возникает. Но теперь я столкнулся с переводом «Зарядное устройство | Адаптер переменного тока для», который выдает строку через «|». как логика ИЛИ. Мне нужен шаблон регулярного выражения, чтобы игнорировать канал и брать всю строку. Я пытался поставить "\" перед трубой. Но это не работает. Я также пробовал это «Зарядное устройство [\|] Адаптер переменного тока для», но он выдает мне «Уведомление: неопределенный индекс: в C:\xampp\htdocs\test\robbie.php в строке 147». ошибка. Спасибо за любую помощь
@SophiaTibbers: когда вы строите шаблон, измените array_keys($pairs) на array_map(function ($i) {return preg_quote($i, '~');}, array_keys($pairs)). preg_quote будет экранировать специальные символы регулярных выражений, такие как вертикальная черта.
Не экранируйте эти символы в массиве $words, потому что соответствующие строки не экранируются.
Вы лучший сэр. Большое спасибо.
Смотреть это stackoverflow.com/questions/3426265/…