用数组中的值替换所有出现的字符串

时间:2013-04-22 16:39:29

标签: php string loops phpmyadmin

我在将字符串发送到数据库之前解析它。我想查看该字符串中的所有<br>并将其替换为我从数组后跟newLine获取的唯一数字。

例如:

str = "Line <br> Line <br> Line <br> Line <br>"
$replace = array("1", "2", "3", "4");

my function would return 
"Line 1 \n Line 2 \n Line 3 \n Line 4 \n"

听起来很简单。我只是做一个while循环,使用strpos获取<br>的所有出现,并使用str_replace替换那些具有所需数字+ \ n的那些。

问题是我总是收到错误而且我不知道我做错了什么?可能是一个愚蠢的错误,但仍然很烦人。

这是我的代码

$str     = "Line <br> Line <br> Line <br> Line <br>";
$replace = array("1", "2", "3", "4");
$replaceIndex = 0;

while(strpos($str, '<br>') != false )
{
    $str = str_replace('<br>', $replace[index] . ' ' .'\n', $str); //str_replace, replaces the first occurance of <br> it finds
    index++;
}

有什么想法吗?

提前致谢,

5 个答案:

答案 0 :(得分:7)

我会使用正则表达式和自定义回调,如下所示:

$str = "Line <br> Line <br> Line <br> Line <br>";
$replace = array("1", "2", "3", "4");
$str = preg_replace_callback( '/<br>/', function( $match) use( &$replace) {
    return array_shift( $replace) . ' ' . "\n";
}, $str);

请注意,这假设我们可以修改$replace数组。如果情况并非如此,你可以保留一个柜台:

$str = "Line <br> Line <br> Line <br> Line <br>";
$replace = array("1", "2", "3", "4");
$count = 0;
$str = preg_replace_callback( '/<br>/', function( $match) use( $replace, &$count) {
    return $replace[$count++] . ' ' . "\n";
}, $str);

您可以从this demo看到此输出:

Line 1 Line 2 Line 3 Line 4 

答案 1 :(得分:1)

$str = str_replace('<br>', $replace[$index] . ' ' .'\n', $str);

这取代了所有它找到的<br>的出现次数。

正确的是每次迭代只进行一次替换:substr_replace可以替换字符串的一个部分。正确的是:

while($pos = strpos($str, '<br>') !== false )
{
    $str = substr_replace($str, $replace[$replaceIndex] . ' ' .'\n', $pos, 4); // The <br> is four bytes long, so 4 bytes from $pos on.
    $replaceIndex++;
}

(不要忘记$之前的replaceIndex$replaceIndex是变量)

答案 2 :(得分:1)

如果您只想计算它,也可以使用它。

$str_expl = explode('<br>',$str);
foreach($str_expl as $index=>&$str)
    if(!empty($str))
        $str .= ($index+1);
$str = implode($str_expl);

答案 3 :(得分:0)

您需要记住变量前面的$。另外,请尝试使用php regex function,它允许指定替换次数。

<?php
$str     = "Line <br> Line <br> Line <br> Line <br>";
$replace = array("1", "2", "3", "4");
$index = 0;
$count = 1;

while(strpos($str, '<br>') != false )
{
    $str = preg_replace('/<br>/', $replace[$index] . " \n", $str, 1); //str_replace, replaces the first occurance of <br> it finds
    $index++;
}
echo $str
?>

答案 4 :(得分:0)

这是我的版本。 8个格式化的行,没有正则表达式,KISS。

$str = "Line <br> Line <br> Line <br> Line <br>";
$replace = array("1", "2", "3", "4");

$temp = explode("<br>", $str);
$result = "";
foreach ($temp as $k=>$v) {
    $result .= $v;
    if ($k != count($temp) - 1) {
        $result .= $replace[$k];
    }
}

echo $result;