Нужно перевести слова в строку с помощью str_replace или любым другим способом

У меня есть 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 покупает его.


Что я хочу:

Красная ячейка очень хорош. Став — это новый. Но никто его покупает.


Есть ли способ перевести точные строки, а не все, что содержит эти слова?

Смотреть это stackoverflow.com/questions/3426265/…

Giacomo M 09.07.2019 10:32
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
3
1
210
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Идея состоит в том, чтобы построить ассоциативный массив ($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». ошибка. Спасибо за любую помощь

Sophia Tibbers 11.07.2019 09:41

@SophiaTibbers: когда вы строите шаблон, измените array_keys($pairs) на array_map(function ($i) {return preg_quote($i, '~');}, array_keys($pairs)). preg_quote будет экранировать специальные символы регулярных выражений, такие как вертикальная черта.

Casimir et Hippolyte 11.07.2019 10:29

Не экранируйте эти символы в массиве $words, потому что соответствующие строки не экранируются.

Casimir et Hippolyte 11.07.2019 10:36

Вы лучший сэр. Большое спасибо.

Sophia Tibbers 11.07.2019 11:50

Другие вопросы по теме