在 PHP 中交换字符串中的两个单词

15

假设有一个字符串 "foo boo foo boo",我想将所有的foo替换为boo,所有的boo替换为foo。期望输出应该是 "boo foo boo foo",但实际上我得到的输出是 "foo foo foo foo"。如何得到期望的输出而不是当前的输出?

    $a = "foo boo foo boo";
    echo "$a\n";
    $b = str_replace(array("foo", "boo"), array("boo", "foo"), $a);
    echo "$b\n";
    //expected: "boo foo boo foo"
   //outputs "foo foo foo foo"
6个回答

31

使用strtr

来自手册:

如果传入两个参数,第二个参数应该是一个形如 array('from' => 'to', ...) 的数组。返回的字符串中,所有数组键出现的位置都会被相应的值所替换。最长的键首先尝试。一旦一个子串被替换,它的新值就不会再次搜索。

在这种情况下,键和值可以具有任意长度,只要没有空键;此外,返回值的长度可能与 str 的长度不同。然而,当所有键具有相同的大小时,这个函数将是最有效的。

$a = "foo boo foo boo";
echo "$a\n";
$b = strtr($a, array("foo"=>"boo", "boo"=>"foo"));
echo "$b\n"; 

输出

foo boo foo boo
boo foo boo foo

实际演练


1
结果,所有项目都将是“foo”吗? - Bora
2
@Orangepill 我以前没用过 strtr。我很喜欢它! - Bora

4
也许可以使用临时变量,例如coo
示例代码如下:
$a = "foo boo foo boo";
echo "$a\n";
$b = str_replace("foo","coo",$a);
$b = str_replace("boo","foo",$b);
$b = str_replace("coo","boo",$b);
echo "$b\n";

3

先将foo替换为zoo。然后将boo替换为foo,最后将zoo替换为boo

$search = array('foo', 'boo', 'zoo');
$replace = array('zoo', 'foo', 'boo');
echo str_replace($search, $replace, $string);

3
如果您的情况与此示例相同,那么使用explodearray_reverse函数也会很方便。
//the original string
$a = "foo boo foo boo";

//explodes+reverse+implode
$reversed_a = implode(' ', array_reverse(explode(' ', $a)));

//gives boo foo boo foo

PS:虽然可能不太友好,也可能无法满足所有与替换相关的情况,但它只是满足您提供的示例。 :)

1
这是一种通用方法,因为它不需要知道特定的单词(例如 fooboo),只需要固定分隔符(这里是空格字符 )。这意味着您可以将输入更改为 $a = "bar baz";,它也可以正常工作。 - hc_dev

1
$a = "foo boo foo boo";
echo "$a\n";
$a = str_replace("foo", "x", $a);
$a = str_replace("boo", "foo", $a);
$a = str_replace("x", "boo", $a);
echo "$a\n";

请注意,"x" 不能出现在 $a 中。

1

试试看

$a = "foo boo foo boo";
echo "$a\n";
$b = str_replace(array("foo", "boo","[anything]"), array("[anything]", "foo","boo"), $a);
echo "$b\n";

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接