Php 如果我想使用相同的";,如何使用preg“u replace”回调;“字符串”;回电话两次?

Php 如果我想使用相同的";,如何使用preg“u replace”回调;“字符串”;回电话两次?,php,regex,preg-replace-callback,Php,Regex,Preg Replace Callback,我编写了一个BBcode函数,用于查找匹配项并进行替换。但是,如果我需要使用相同的preg_匹配,它将无法正确返回匹配 代码是: 您的regexp将从第一个[div class=“…”]匹配到它找到的第一个[/div]。因此,开始和结束div不匹配(正如您在示例中所看到的)。要防止出现这种情况,请在存在另一个[div或[/div时使用环视来防止匹配: "/\[div class=\"([^\"]+)\"\]((?!\[div|\[\/div).)*\[\/div\]/is" 请注意,这将只匹

我编写了一个BBcode函数,用于查找匹配项并进行替换。但是,如果我需要使用相同的preg_匹配,它将无法正确返回匹配

代码是:


您的regexp将从第一个
[div class=“…”]
匹配到它找到的第一个
[/div]
。因此,开始和结束div不匹配(正如您在示例中所看到的)。要防止出现这种情况,请在存在另一个
[div
[/div
时使用环视来防止匹配:

"/\[div class=\"([^\"]+)\"\]((?!\[div|\[\/div).)*\[\/div\]/is"
请注意,这将只匹配一次(仅内部
div
-对),因此您必须重复匹配,直到再也找不到任何内容为止

演示:

将输出:

array(3)
{
    [0]=>
    string(22) "[div class="d"]e[/div]"
    [1]=>
    string(1) "d"
    [2]=>
    string(1) "e"
}

编辑:是的,正如您所评论的,它只替换第一个匹配项。
*
位于错误的位置。请尝试以下代码:

$str = 'a[div class="b"]c[div class="d"]e[/div]f[/div]g';
$reg = "/^(.*)(\[div class=\"([^\"]+)\"\])((?!\[div|\[\/div).*)\[\/div\](.*)$/is";

$result = $str;
$step = 1;
echo "step 0: $result\n";
do {
    $result = preg_replace($reg, "$1<div class=\"$3\">$4</div>$5", $result, -1, $count);
    echo "step $step: $result\n";
    $step++;
} while ($count > 0);
$str='a[div class=“b”]c[div class=“d”]e[/div]f[/div]g';
$reg=“/^(.*)(\[div class=\”([^\“]+)\“\])((?!\[div\\[\/div)。*)\[\/div\](.*)$/is”;
$result=$str;
$step=1;
回显“步骤0:$result\n”;
做{
$result=preg_replace($reg,$1$4$5,$result,-1,$count);
回显“步骤$step:$result\n”;
$step++;
}而($count>0);
这将产生:

step 0: a[div class="b"]c[div class="d"]e[/div]f[/div]g
step 1: a[div class="b"]c<div class="d">e[/div]f</div>g
step 2: a<div class="b">c<div class="d">e</div>f</div>g
step 3: a<div class="b">c<div class="d">e</div>f</div>g
步骤0:a[div class=“b”]c[div class=“d”]e[/div]f[/div]g
步骤1:a[div class=“b”]ce[/div]fg
步骤2:acefg
步骤3:acefg

注意:现在,它太频繁地匹配了一次,循环不是最优的。

我需要它使用递归重放来查看preg_match,而不是preg_replace我已经做了…它似乎找到了与opanning标记“[div]”的第一个匹配,然后用第一个结束标记“[/div]将其关闭“即使那个结束标记不属于那个标记。它没有什么区别……根本不确定它是否可以修复……它与任何BBcode标记都是一样的……不仅[div](这只是一个例子……)我试过了。它也不起作用……它仍然找不到第一个BBcode标记的匹配项。示例输出将是:[div class=“class1”]div中的div[/div]谢谢,你的回答很有帮助。但是现在我认为这不能只用regexp来完成。我也在网上查了一些其他bbcode库。没有找到一个完整的…也尝试了JBBcode,但我不能自定义我自己的一些标记…有什么建议吗?对不起,我没有bbcode等的经验,也不能推荐任何库。但是,我在你的Q中使用类构造真的有必要吗?现在,你添加reg exp作为数组键(因此,你不能复制它)。也许你可以使用另一种方法?一个简单的函数?我知道这是一个老问题,但是,如果有人仍然在寻找解决方案,这个:对于我的repo,可能是你的解决方案。
step 0: a[div class="b"]c[div class="d"]e[/div]f[/div]g
step 1: a[div class="b"]c<div class="d">e[/div]f</div>g
step 2: a<div class="b">c<div class="d">e</div>f</div>g
step 3: a<div class="b">c<div class="d">e</div>f</div>g