6

我在将字符串发送到数据库之前对其进行解析。我想遍历<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循环,获取所有<br>使用strpos的情况,然后使用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++;
}

请问有什么想法吗?

提前致谢,

4

6 回答 6

8

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

$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);

你可以从这个演示中看到这个输出:

Line 1 Line 2 Line 3 Line 4 
于 2013-04-22T16:43:52.343 回答
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是一个变量)

于 2013-04-22T16:43:40.547 回答
1

如果你只是想数它,你也可以使用它。

$str_expl = explode('<br>',$str);
foreach($str_expl as $index=>&$str)
    if(!empty($str))
        $str .= ($index+1);
$str = implode($str_expl);
于 2013-04-22T16:53:11.617 回答
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
?>
于 2013-04-22T16:47:15.660 回答
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;
于 2013-09-19T08:17:38.293 回答
0

preg_replace_callback帮助您操作替换过程,而nickb的回答显示了如何完成。

但是,匹配的数量可能比$replace数组中的项目数量多。如果要从第 0 项重新开始使用其元素,则需要在计数器等于数组大小时重置计数器。$replace

查看PHP 演示

$text = "Line <br> Line <br> Line <br> Line <br> Line <br> Line <br>";
$replace = array("1", "2", "3", "4");
$counter = 0;
$text = preg_replace_callback('~<br\s*/?>~', function($m) use($replace, &$counter) {
    if ($counter === count($replace)) { $counter = 0; }
    return $replace[$counter++];
}, $text);
echo $text;

输出:Line 1 Line 2 Line 3 Line 4 Line 1 Line 2

请注意,<br\s*/?>正则表达式匹配br可以自关闭的标签(/?匹配可选/字符,并且为了/在模式中保持未转义,我使用~字符作为正则表达式分隔符)并且在前后可能包含零个或多个空格(\s*)/ 。br/>>

于 2021-10-09T11:21:24.680 回答