php中相同字符串中的多个字符串替换

时间:2009-04-10 12:46:43

标签: php string preg-replace

我有以下字符串替换问题,我在这里解决了很多问题

PFB样本字符串

$string = 'The quick sample_text_1 56 quick sample_text_2 78 fox jumped over the lazy dog.';

$patterns[0] = '/quick/';
$patterns[1] = '/quick/';
$patterns[2] = '/fox/';

$replacements[2] = 'bear';
$replacements[1] = 'black';
$replacements[0] = 'slow';

echo preg_replace($patterns, $replacements, $string);   

我需要根据发送的号码替换“快速”

即如果我对函数的输入是56,则quick之前的56需要替换为bear,如果我对函数的输入是{{1} }},78之前的快速需要替换为78

有人可以帮帮我吗?

4 个答案:

答案 0 :(得分:1)

我认为正则表达式会让这很难,但您应该只能使用strpos()substr()str_replace()来执行此操作。

  • 使用strpos查找字符串中的位置56和78.

  • 然后使用substr将字符串剪切到这些点的子字符串。

  • 现在,将'quick'替换为正确的变量,具体取决于是否向该函数发送了56或78以及您正在处理哪个子字符串。

答案 1 :(得分:0)

不使用preg_replace,而是使用substr_replace进行字符串替换,strpos根据您传递的参数查找字符串中的起点和终点。您的模式是一个简单的字符串,因此它不需要正则表达式,substr_replace将允许您指定字符串中的起点和终点来进行替换(这似乎是您正在寻找的)。

修改

根据您的评论,听起来您必须进行大量检查。我没有测试过这个,所以它可能有一两个bug,但尝试这样的函数:

function replace($number, $pattern, $replacement)
{
    $input = "The quick sample_text_1 56 quick sample_text_2 78 fox jumped over the lazy dog.";
    $end_pos = strpos($input, $number);
    $output = "";
    if($end_pos !== false && substr_count($input, $pattern, 0, $end_pos))
    {
        $start_pos = strrpos(substr($input, 0, $end_pos), $pattern);
        $output = substr_replace($input, $replacement, $start_pos, ($start_pos + strlen($pattern)));
    }
    return $output;
}

此功能执行以下操作:

  1. 首先,检查字符串($end_pos !== false
  2. 中是否存在“number”参数
  3. 检查您的模式在字符串的开头和数字的位置(substr_count($input, $pattern, 0, $end_pos)
  4. 之间至少存在一次
  5. 使用strrpos函数获取子字符串
  6. 中最后一次出现的模式的位置
  7. 使用模式的起始位置和长度,使用substr_replace
  8. 插入替换字符串

答案 2 :(得分:0)

你这样做是错误的。取决于您的函数输入,您应该使用正确的查找和替换值。只需根据函数输入值创建查找和替换值的映射。像:

$map = array(
  56 => array('patterns' => array(), 'replacements' => array()),
  78 => array(...)
);

答案 3 :(得分:0)

试试这个:

$searchArray = array("word1", "sound2", "etc3");
$replaceArray = array("word one", "sound two", "etc three");
$intoString = "Here is word1, as well sound2 and etc3";
//now let's replace
print str_replace($searchArray, $replaceArray, $intoString);
//it should print "Here is word one, as well sound two and etc three"