将PHP BBCode REGEX转换为JavaScript,可以帮助确定问题


Converting PHP BBCode REGEX to JavaScript, can someone help pinpoint an issue?

我正在尝试将以下PHP REGEX转换为JavaScript:

$article_f = preg_replace('#'[b'](.+)'['/b']#iUs', '<b>$1</b>', $article_text);

我想出了以下JavaScript:

 article_f = article_f .replace(/'[b'](.+)'['/b']/gi, '<b>$1</b>');

出于某种原因,这允许忽略一个匹配,如果它与另一个匹配在同一行,它实际上会将它们组合成一个大的匹配,例如:

[b] this is bold[/b] and [b] this is too [/b]

将被取代

<b> this is bold[/b] and [b] this is too </b>

任何关于如何解决这个问题的想法都将不胜感激。

使用以下模式:

/'[b'](.+?)'['/b']/gi

问题是+量词是贪婪的(默认行为),因此.+捕获了他所能捕获的所有内容(即:this is bold[/b] and [b] this is too)。如果你加了一个问号,量词就会变得不合理(=懒惰),并在第一个结束的bbcode标记处停止。

在php模式中,您可以看到末尾的U修饰符,它将所有贪婪量词切换为lazy,将所有懒惰量词切换为贪婪。这就是php模式中.+懒惰的原因。(默认行为颠倒)。

您也可以注意到php模式中的s修饰符。s代表单行。这意味着点也可以匹配换行符。但是Javascript没有对等的。要使用Javascript,必须用['s'S]替换点,否则.+将在第一个换行处停止匹配。

php模式的"完美"翻译是:

/'[b'](['s'S]+?)'['/b']/gi