我正在尝试将以下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