【发布时间】:2015-05-10 10:04:02
【问题描述】:
我编写了一个 BBcode 函数来查找匹配项并进行替换。但是,如果我需要使用相同的 preg_match 它不会正确返回匹配。
代码是:
<?php
//CODE EXAMPLE
class BBCode {
protected $bbcode = array();
public function __construct() {
// Replace [div class="class name(s)"]...[/div] with <div class="...">...</div>
$this->bbcode["/\[div class=\"([^\"]+)\"\](.*?)\[\/div\]/is"] = function ($match) {
return "<div class=\"$match[1]\">$match[2]</div>";
};
}
public function rander($str) {
foreach ($this->bbcode as $key => $val) {
$str = preg_replace_callback($key, $val, $str);
}
return $str;
}
}
?>
如果我只使用一个标签就可以了! 像这样:
$str= "[div class="class1"]this is a div[/div]";
即使我使用不同的标签,它也很有效。
$str= "[div class="class1"][p]this is a paragraph inside a div[/p][/div]";
但是当我尝试使用时:
$str = "[div class="class1"][div class="class2"]A div inside a div[/div][/div]";
它不工作,输出是:
<div class="class1">[div class="class2"]div inside a div</div>[/div]
代替:
<div class="class1"><div class="class2">div inside a div</div></div>
如何修复它以使其正常工作?
谢谢!
【问题讨论】:
-
我需要它来使用递归替换
-
尝试查看 preg_match 而不是 preg_replace
-
我已经做到了......它似乎找到了第一个与打开标记“[div]”匹配的匹配项,然后用第一个结束标记“[/div]”关闭它,即使那个结束标签不属于该标签。它没有任何区别......不确定它是否可以修复......
-
它对任何 BBcode 标签都一样...不仅 [div](这只是一个示例...)
标签: php regex preg-replace-callback