将单个字符串替换为多个字符串


Replace a single string with multiple strings

$message = "[Link] Thanks [Link]";
echo str_replace(
array("[Link]", "[Link]"), 
array("mylink1", "mylink2"), 
$message
);
打印:"mylink1

谢谢mylink1">

但是,我想打印"mylink1 谢谢mylink2">

正确的方法是什么?

您可以将此函数用作代码中的直接替换。它使用@h2ooooooo演示的vsprintf。我的早期版本失败了,因为我以错误的方式使用了str_replace$count参数。

function str_replace_array($search, array $replace, $subject)
{
    return vsprintf(
      str_replace('[Link]', '%s', $subject),
      $replace);
}
$message = "[Link] Thanks [Link]";
echo str_replace_array(
   "[Link]",
   array("mylink1", "mylink2"), 
   $message
);

也许您正在寻找sprintf

$message = "%s Thanks %s";
echo sprintf($message, "mylink1", "mylink2"); // mylink1 Thanks mylink2

演示


如果您更喜欢使用数组(对动态变量有用(,则vsprintf

$message = "%s Thanks %s";
echo vsprintf($message, array("mylink1", "mylink2")); // mylink1 Thanks mylink2

演示


如果你真的不想使用sprintfvsprintf,你可以使用preg_replace,第4个参数(limit(是"1"(只在你找到的第一个匹配项上这样做(。确保与preg_quote一起使用,以便.+*等没有特殊含义:

<?php
function smartReplace($search, $replace, $subject) {
    if (!is_array($search)) {
        throw new Exception('$search must be an array');
    }
    if (!is_array($replace)) {
        throw new Exception('$replace must be an array');
    }
    if (!is_string($subject)) {
        throw new Exception('$subject must be a string');
    }
    for ($i = 0, $len = count($search); $i < $len; $i++) {
        $subject = preg_replace('/' . preg_quote($search[$i], '/') . '/', $replace[$i], $subject, 1);
    }
    return $subject;
}
$message = "[Link] Thanks [Link]";
echo smartReplace(
    array("[Link]", "[Link]"), 
    array("mylink1", "mylink2"), 
    $message
); // mylink1 Thanks mylink2

演示

您可以使用preg_replace而不是str_replace来设置限制

$message = "[Link] Thanks [Link]";
$replacements = array ("Link 1", "Link 2");
while (!empty($replacements)) {
  $replacement = array_shift($replacements);
  $message = preg_replace("/'[Link']/", $replacement, $message, 1);
}
echo $message;

输出:

链接

1 感谢链接 2

一个简单的方法是将str_replacevsprintf结合起来。

$message = "[Link] Thanks [Link]";
$template = str_replace("[Link]", "%s", $message);
echo vsprintf($template, array("mylink1", "mylink2"));

试试这个

$message = "[Link] Thanks [Link]";
echo preg_replace(array("/'[Link']/", "/'[Link']/"), 
array("mylink1", "mylink2"), 
$message, 1);

如果消息中有%,则使用 vsprintf 可能是有害的。您可以将所有出现的%替换为 %%,然后再将[Link]替换为 %s,然后调用 vsprintf。但我只会使用简单的数组函数,这样你就不必担心正确转义字符。

function str_replace_array($message, $search, $replacements)
{
    $result = '';
    $pieces = explode($search, $message);
    $replace = reset($replacements);
    foreach ($pieces as $i => $piece) {
        if ($replace === FALSE) {
            throw new Exception('There are not enough replacements for all occurences of the search string.');
        }
        if ($i !== 0) {
            $result .= $replace;
            $replace = next($replacements);
        }
        $result .= $piece;
    }
    return $result;
}
echo str_replace_array('[Link] Thanks [Link]', '[Link]', array('mylink1', 'mylink2'));