1

我需要将“我”一词替换为“你”,同时将“你”一词替换为“我”。当两个单词不相邻时,它与 strtr() 一起使用,但当它们相邻时,它会替换第一个单词,然后忽略第二个单词。有没有什么办法解决这一问题?

<?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'替换为'之类的答案你'。

4

3 回答 3

2

无论单词是连续的还是分开的,这似乎都有效。

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

它不是真正同时的。回调循环匹配。但是,替换似乎是在原始字符串上完成的,而不是在每次回调后更新的临时字符串(避免你的“你你”示例),所以它基本上是一回事。

于 2016-05-16T21:01:17.687 回答
2

将匿名函数与数组一起使用怎么样?任何使用匿名函数的借口,都让我高兴 :)

$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) */
于 2016-05-17T10:14:15.603 回答
0

这有点(在某种程度上,因为使用了廉价的把戏)

将所有 'you's 替换为 'you1234',然后将所有 'me's 替换为 '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);
于 2016-05-17T09:03:17.030 回答