15

假设有一个字符串“foo boo foo boo”,我想用 boo 替换所有 fooes,用 foo 替换 booes。预期输出是“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"
4

6 回答 6

30

使用strtr

从手册:

如果给定两个参数,第二个应该是数组形式的数组('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

在行动

于 2013-07-25T06:32:38.463 回答
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";
于 2013-07-25T06:32:25.167 回答
3

首先foozoo. 然后boofoo最后zooboo

$search = array('foo', 'boo', 'zoo');
$replace = array('zoo', 'foo', 'boo');
echo str_replace($search, $replace, $string);
于 2013-07-25T06:33:30.953 回答
3

如果在这个例子中这是你的情况的顺序,那么使用explodeandarray_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:可能对内存不友好,也可能无法满足围绕替换的所有情况,但它只是满足您给出的示例。:)

于 2017-01-23T12:02:29.757 回答
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 中

于 2013-07-25T06:33:10.897 回答
1

试试看

$a = "foo boo foo boo";
echo "$a\n";
$b = str_replace(array("foo", "boo","[anything]"), array("[anything]", "foo","boo"), $a);
echo "$b\n";
于 2013-07-25T06:34:35.133 回答