使用PHP中的循环替换文本

时间:2014-11-13 11:20:33

标签: php preg-match

我正在尝试遍历每个[footnote]并将其替换为一些HTML。以下是一些示例文本:

Hello [footnote], how are you [footnote], what are you up to [footnote]?

使用preg_match_all创建计数:

$match_count = preg_match_all("/\[footnote]/", $content);

然后我将此计数用作循环,以使用适当的HTML查找和替换文本:

for ($i=0; $i < $match_count; $i++) { 
   $new_content = str_replace('[footnote]', "<span class='footnote'>$i</span>", $content);
}

然而,之后,当echo $new_content;每个[footnote]具有相同的数字时, 2

<span class="footnote">2</span>
<span class="footnote">2</span>
<span class="footnote">2</span>

有人知道为什么这个数字没有递增吗?这就是我想要的

<span class="footnote">1</span>
<span class="footnote">2</span>
<span class="footnote">3</span>

3 个答案:

答案 0 :(得分:1)

你可以这样做

$i = 0;
preg_replace_callback('/[footnote]/', 'replaces_counter', $content);

function replaces_counter($matches) {
  global $i;
  return "<span class='footnote'>".$i++."</span>";
}

答案 1 :(得分:0)

str_replace一次取代所有内容,您需要preg_replace支持$limit(=要替换的数量):

$content = "Hello [footnote], how are you [footnote], what are you up to [footnote]?";

$i = 0;
do {
    $i++;
    $content = preg_replace('~\[footnote\]~', "<span>$i</span>", $content, 1, $count);
} while($count);

print $content;

请注意,第五个参数$count会使您的点钞代码变得多余 - 我们会继续更换,直到无法再进行更换为止。

答案 2 :(得分:0)

由于您尝试替换文字字符串,因此可以避免使用正则表达式。例如:

$str = 'Hello [footnote], how are you [footnote], what are you up to [footnote]?';

$arr = explode('[footnote]', $str);
$count = 1;

$result = array_reduce($arr, function ($carry, $item) use (&$count) {
     return (isset($carry)) 
         ? $carry . '<span class="footnote">' . $count++ . '</span>' . $item
         : $item;   
});

print_r($result);