2016-05-16 111 views
1

我需要用單詞'you'替換單詞'me',同時用'me'單詞替換單詞'you'。當兩個單詞不相鄰時,它與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'替換'me',然後將所有'you1234替換爲'我',然後將所有'me1234替換爲'你'。

+1

[無益的評論]我很好奇,爲什麼你想同時性。這只是一個學術問題,還是存在真正的用例? – Utkanos

回答

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) */ 
+0

OH!這真棒。完美的功能。我絕對需要查找匿名函數,以及如何去做。它們看起來非常有用。 – frosty

2

這似乎工作,無論單詞是順序還是分開。

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

這不是真的同時;回調在比賽中循環。但是,替換似乎是在原始字符串上完成的,而不是在每次回調後更新的臨時更新(避免使用「您」)示例,因此它基本上是同一件事。

+0

有沒有辦法將它轉換成類似strtr()函數的方式?在哪裏你可以用數組同時替換多個單詞?這似乎只適用於一次一個字。 – frosty

+0

另外,我有點好奇,因爲在問題中,我問的是兩個單詞相鄰的時候,這是行不通的。但是你的例子,使用了兩個完全相反的詞。 – frosty

+0

不知道機制,但它似乎工作,無論他們是否彼此相鄰。正如我所提到的,這大概意味着替換是在原始字符串的臨時版本上完成的,存儲在內存中,而不是迭代更新的字符串(這會導致您用'strtr'找到的問題。這種方法可以用'strtr'來實現。 – Utkanos

0

這是有點

(在某種程度上是因爲使用廉價把戲的,)全部替換「你是用‘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);