jQuery 多行正则表达式 (dotall)?

jQuery regex over multi-line (dotall)?

我很难定位、捕获和替换一些跨越多行的 BBCode(到 HTML)。

特别是 [QUOTE] 标签..

我有 read/searched 并且知道 javascript/jQuery 中没有 dotall,而是使用 [\s\S][^].. 但我似乎无法理解出来了。

示例字符串(来自 XML 节点的文本)

<![CDATA[

[QUOTE=SOMENAME]Well I tell ya what .....
Sounds like a great project.
[/QUOTE]

[url]http://www.randomlink.com/something/[/url]

[url=https://www.another site.com/user/xxxxxxx]Sent from my whatever[/url]

[URL="http://www.somesite.com/"]http://www.somesite.com//[/URL]

]]>

我在 regex101.com 上一遍又一遍地尝试,看看我是否能偶然发现它..但我永远无法完全正确。

我需要定位 [quote] [/quote] 部分..

捕获 [QUOTE= ] 部分中的 "SOMENAME".. 以及两个 [quote] 标签之间的文本。

这没有得到完全匹配,但得到了初始标签和 SOMENAME 的第一个 group1 捕获

\[quote=(.*?)\]

这太过分了,进入下一个 element/node,以及错误的 group2 捕获:

\[quote=([\s\S]+?)\](.*)\[

我怎样才能正确地只定位引号部分并正确地捕获这两个组..当它像那样跨越多行时?

edit/update:

看起来我摸索着找到一个有效的正则表达式解决方案。

发帖是为了与他人分享这种方法对我的效果。 (我确定还有其他方法吗?)

但是对于跨越多行的 targeting/capturing 内容。我使用了这个正则表达式:

\[quote=(.*?)\]([^\[]+)\[\/quote]

但是,如果有人可以帮助解决多个 NESTED 引号标签以及如何替换它们...那将不胜感激。


正则表达式可能是这样的:

Regex101

(?:\[QUOTE=)([^\]]+)\]([^\[]+)(?:\[\/QUOTE\])
  • (?:\[QUOTE=) 匹配 [QUOTE=,其中 ?: 表示“非捕获组” .
  • ([^\]]+) 匹配任何非右方括号 ].
  • \] 匹配右方括号 ].
  • ([^\[]+) 匹配任何非左方括号 [.
  • (?:\[\/QUOTE\]) 匹配 [/QUOTE].
  • 的“非捕获组”

jsFiddle 1


Update/Edit:

现在为了匹配多个 nested [quote] 标签并将它们转换为 HTML,如果将上面的正则表达式分成两部分会更容易.第一部分替换所有出现的开头 [QUOTE=SOMEONE] 并将其替换为 <blockquote>SOMEONE:.

第二部分会将所有 [\QUOTE] 标签替换为 </blockquote>

jsFiddle 2

var btnProcess = document.getElementById('process');

btnProcess.addEventListener('click', function() {
  var data = document.getElementById('data-txt').value;

  data = data.trim().replace(/\r|\n|\r\n/g, "<br>");
  data = data.replace(/(?:\[QUOTE=)([^\]]+)\]/gi, "<blockquote><strong>:</strong><br>");
  data = data.replace(/\[\/QUOTE\]/ig, '</blockquote>');
  document.getElementById('result').innerHTML = data;
});
blockquote {
  margin: 10px; padding: 5px; background-color: #eee; border: 1px dashed grey;
}
blockquote blockquote { background-color: #f1f1f1; }
blockquote blockquote blockquote { background-color: #f5f5f5; }
<textarea id="data-txt" rows="5" cols="50">
[QUOTE=SOMEONE]Well I tell ya what .....
Sounds like a great project.

[QUOTE=anotherone]
[QUOTE=firstone] I need help with regex[/QUOTE]
I am going to make it!

and it'll be great
[/QUOTE]

I am excited too.
[/QUOTE]
</textarea><br>
<button id="process">Process</button>
<hr>
<strong>Result:</strong><br>
<div id="result"></div>