0

I am trying to convert the following PHP REGEX into JavaScript:

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

I have come up with the following JavaScript:

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

For some reason this is allowing a match to go ignored if it is on the same line as another match, it will actually combine them into one large match, e.g.:

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

Will be replaced with

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

Any ideas one how to fix this would be greatly appreciated.

4

1 回答 1

2

改用此模式:

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

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

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

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

php 模式的“完美”翻译是:

/\[b\]([\s\S]+?)\[\/b\]/gi
于 2013-07-16T00:02:43.150 回答