1

「私」という単語を「あなた」という単語に置き換え、「あなた」という単語を「私」という単語に同時に置き換える必要があります。2 つの単語が隣り合っていない場合は 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:「'you's をすべて 'you1234' に置き換え、次にすべての 'me's を 'me1234' に置き換えてから、すべての 'you1234's を 'me' に置き換え、すべての 'me1234's を ' に置き換えてください。あなた'。

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 に答える