替换方括号-php中的所有子字符串匹配数字

时间:2012-03-19 12:50:41

标签: php regex preg-replace

它可能很容易,但我不能这样做..

给出一个字符串:

$str="i have an apple[1], and another one [2], and another[3]";

我想将[1][2] ..替换为<tag id=1> <tag id=2>

我试过$str2 = preg_replace('/[([1-9][0-9]*)]/', '<tag id=1>', $str);

但无法插入变量

$str2 = preg_replace('/[([1-9][0-9]*)]/', '<tag id=$var>', $str);

我正在使用的正则表达式也是一个问题,它适用于某些情况但不适用于某些情况:(

任何帮助都深受赞赏..

编辑: 正如@ m42和@scibuff指出的那样,有效的正则表达式是:/\[([1-9][0-9]*)\]/

但是如何为每次替换增加?

编辑2: 我误解了M42的回答,谢谢。

但是如果我有另一个字符串呢?

str2="i have an egg [4], and another egg [5]";

如何继续第一个preg_replace开始的增量?

我的意思是,期望的结果是:

i have an apple <tag id=1>,... i have an egg [4]..
编辑3:由M42解决 - 事实上,问题的第二部分毫无意义,preg_replace会不断增加......谢谢所有人!

2 个答案:

答案 0 :(得分:2)

怎么样:

$str2 = preg_replace('/\[([1-9][0-9]*)\]/', "<tag id=$1>", $str);

这是一个测试:

$arr = array(
    "I have an apple[1], and another one [2], and another[3]",
    "i have an egg [4], and another egg [5]",
);
foreach ($arr as $str) {
    echo "before: $str\n";
    $str = preg_replace('/\[([1-9]\d*)\]/', "<tag id=$1>", $str);
    echo "after : $str\n";
}

<强>输出:

before: I have an apple[1], and another one [2], and another[3]
after : I have an apple<tag id=1>, and another one <tag id=2>, and another<tag id=3>
before: i have an egg [4], and another egg [5]
after : i have an egg <tag id=4>, and another egg <tag id=5>

答案 1 :(得分:0)

        $str="i have an apple[1], and another one [2], and another[3]";
        preg_match_All("/\[[0-9]+\]/",$str,$matches);
        $replace=array();
        for($j=0;$j<count($matches[0]);$j++)
        {
         $replace[]=htmlspecialchars("<tag id=$j>");
        }
         for($i=0;$i<count($matches[0]);$i++)
        {
        for($j=0;$j<count($matches[0]);$j++)
        {
        if($i==$j)
        {
         $str=(str_replace($matches[0][$i],$replace[$j],$str));
        }
        }
        }
        echo $str;