【发布时间】:2017-03-04 15:57:10
【问题描述】:
$regex = '/\[b\](.*?)\[\/b\]/is';
$string = '[b][b][b]string[/b][/b][/b]';
这只会匹配到第一个 [/b],所以如果我使用这个正则表达式将此 bbcode 转换为 HTML,我最终会得到:
string[/b][/b]
我正在使用 PHP preg_replace,我怎么能只得到 string,所以 3 个 html 粗体标签。
【问题讨论】:
-
也许
\[(\/?)b\]和<$1strong>这不会检查匹配的配对。这将与str_replace(array('[b]','[/b]'), array('<strong>', '</strong>')相同 -
你不能做不对称替换(
\[(\/|)b\]到<$1b>)吗? -
可以反复替换,直到没有其他匹配为止。
-
见ideone.com/15qAsY。你可以循环运行
$re = '~\[b]((?:(?!\[/?b]).)*)\[/b]~is';,直到没有匹配。 -
@Wiktor Stribiżew 这也很有用,也许我可以使用 revo 解决方案来解析用户输入,因为它删除了不必要的标签,而且转换所有配对标签看起来更简单到 HTML。
标签: php regex preg-replace preg-match