2016-05-16 17 views
1

gleichzeitig brauche ich das Wort ‚ich‘ mit dem Wort ‚Du‘, und das Wort ‚Sie‘ mit dem ‚ich‘ gleichzeitig zu ersetzen. Es funktioniert mit strtr(), wenn die 2 Wörter nicht nebeneinander sind, aber wenn sie sind, ersetzt es das erste Wort und ignoriert dann das zweite Wort. Gibt es eine Möglichkeit, das zu beheben?zwei Worte ersetzen miteinander

<?php 

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

echo $string; 

?> 

Tatsächliches Ergebnis:

Sie sagen, Sie wollen es richtig

Brauchen Ergebnis zu erhalten:

Sie sagen wollen, dass ich es richtig

erhalten PS: Will nicht wirklich Antworten th Bei etwas wie "Ersetze alles" du bist mit "du1234", und dann ist alles "ich" mit "me1234", dann ersetze einfach alle "du1234's" durch "mich" und alle "me1234's" durch "du".

+1

[nicht hilfreich Kommentar] Ich bin neugierig, warum Sie Gleichzeitigkeit wollen. Ist das nur eine akademische Frage oder gibt es einen echten Anwendungsfall? – Utkanos

Antwort

2

Wie wäre es mit einer anonymen Funktion mit einem Array? Jede Ausrede eine anonyme Funktion zu nutzen, macht mich glücklich :)

$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) */ 

Oder für komplizierteren Ersatz

$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! Das ist großartig. Die perfekte Funktion. Ich muss auf jeden Fall anonyme Funktionen nachschlagen und wie man sie macht.Sie scheinen wirklich nützlich zu sein. – frosty

2

Dies scheint zu funktionieren, ob die Worte sequentiell oder getrennt sind.

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

Es ist nicht wirklich gleichzeitige; Der Rückruf läuft über die Übereinstimmungen. Die Ersetzungen werden jedoch anscheinend auf der ursprünglichen Zeichenfolge ausgeführt, nicht auf einer temporären, die nach jedem Rückruf aktualisiert wird (Sie vermeiden Ihr "Sie" - Beispiel), also ist es im Grunde dasselbe.

+0

Gibt es eine Möglichkeit, dies in eine Art wie die strtr() -Funktion zu konvertieren? Wo können Sie mehrere Wörter gleichzeitig mit dem Array ersetzen? Dies scheint nur für jeweils ein Wort zu funktionieren. – frosty

+0

Auch bin ich irgendwie neugierig, da ich in der Frage gefragt habe, wann die 2 Wörter nebeneinander sind, wird es nicht funktionieren. Aber Ihr Beispiel verwendet zwei Wörter, die genau gegenüberliegen. – frosty

+0

Nicht sicher über die Mechanik, aber es scheint zu funktionieren, ob sie nebeneinander sind oder nicht. Wie ich bereits erwähnt habe, bedeutet dies vermutlich, dass die Ersetzung auf einer temporären Version der ursprünglichen Zeichenfolge erfolgt, die im Speicher gespeichert ist, und nicht auf der iterativen, aktualisierten Zeichenfolge (was zu dem Problem führt, das Sie mit 'strtr 'gefunden haben) So geht das mit 'strtr'. – Utkanos

0

Diese irgendwie ist (auf gewisse Weise, wegen der billigen Trick)

Alle ersetzen 'Sie ist mit 'you1234', und dann all' mich ist mit 'me1234'

Antwort ... aber es sollte funktionieren. Es ist Funktion, String und Ersatz (assoziative) Array sind Argumente. Es sollte für mehrere Ersetzungen gleichzeitig funktionieren. Die Position der Saiten spielt keine Rolle.

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); 
Verwandte Themen