Замените два слова друг на друга одновременно

Мне нужно заменить слово «я» словом «ты», а слово «ты» — словом «я» одновременно. Он работает с strtr (), когда 2 слова не находятся рядом друг с другом, но когда они есть, он заменяет первое слово, а затем игнорирует второе слово. Есть ли способ это исправить?

<?php

$string = "tell me you want to get it right";
$string = trim(strtr(" ".trim($string)." ", array(
" me " => " you ",
" you " => " me ")));

echo $string;

?>

Фактический результат:

сказать вам, что вы хотите, чтобы это правильно

Нужен результат:

сказать тебе, что я хочу, чтобы это правильно

PS: На самом деле не нужны никакие ответы, в которых используется что-то вроде «Замените всех вас» на «you1234», а затем все «я» на «me1234», затем просто замените все «you1234» на «я», а все «me1234» на «вы». ,

1

Решение

Как насчет использования анонимной функции с массивом? Любое оправдание использования анонимной функции делает меня счастливым 🙂

$string = "tell me you want to get it right";
$string = implode(" ", array_map(function($word, $swap = ["me", "you"]) {
return ($index = array_search($word, $swap)) === false
? $word : $swap[++$index % 2];
}, explode(" ", $string)));
var_dump($string);
/* string 'tell you me want to get it right' (length=32) */

Или для более сложных замен

$string = "tell me you want to get it right";
$replacements = ["me" => "you", "you" => "me", "right" => "wrong"];
$string = implode(" ", array_map(function($word) use($replacements) {
return isset($replacements[$word]) ? $replacements[$word] : $word;
}, explode(" ", $string)));
var_dump($string);
/* string 'tell you me want to get it wrong' (length=32) */
2

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

Это, кажется, работает, являются ли слова последовательными или разделенными.

$str = "foo something bar";
echo preg_replace_callback(
'/\b(foo|bar)\b/',
function($match) { return $match[0] == 'foo' ? 'bar' : 'foo'; },
$str
);

Это не действительно одновременное; обратный вызов зацикливается на спичках. Однако, казалось бы, замены выполняются в исходной строке, а не во временной, которая обновляется после каждого обратного вызова (избегая вашего примера «вы»), так что это в основном то же самое.

2

Это своего рода (в некотором смысле, из-за использования дешевого трюка)

Замените все «вы» на «you1234», а затем все «я» на «me1234»

ответ … но, это должно работать. Это функция, строка и замена (ассоциативный) массив являются аргументами. Он должен работать для нескольких замен одновременно. Положение струн не имеет значения.

function replace_sim($str, $replace) {

$arr = str_word_count($str, 1);
$keys = array();
$real_val = array();
for ($i = 0; $i < count($arr); $i++) {

foreach($replace as $key => $value) {
if ($arr[$i] == $key) {
$arr[$i] = strrev($value);

$keys[] = $i;
$real_val[] = $value;
}
}

}
$i = -1;
foreach($keys as $key) {
$i++;
$arr[$key] = $real_val[$i];
}

$str = join(' ', $arr);
return $str;
}

//usage
$string = "tell me you want to you get it right me you";
$replace=array('me'=>'you','you'=>'me','get'=>'it','it'=>'get');
echo replace_sim($string,$replace);

echo '<br>';

$string = "tell me i want you";
$replace=array('me'=>'you','you'=>'me');
echo replace_sim($string,$replace);
0
По вопросам рекламы [email protected]