jQuery regex over multi-line (dotall)?



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

特别是[QUOTE]标签。

我已经阅读/搜索并理解javascript/jQuery中没有dotall,而是使用[sS][^]。 但我似乎想不通。

示例字符串(来自 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=(.*?)]

这太过分了,进入下一个元素/节点,以及错误的 Group2 捕获:

[quote=([sS]+?)](.*)[

我如何才能正确地定位报价部分并正确捕获两个组......当它跨越这样的多行时?

编辑/更新:

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

发帖与他人分享这种方法对我的作用。 (我确定还有其他方法可以做到这一点?

但用于定位/捕获跨多行的内容。我使用了这个正则表达式:

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

但是,如果有人可以帮助解决多个嵌套引号标签以及如何替换它们......这是值得赞赏的。


  • 是的,我知道正则表达式可能不是解决此问题的最佳方法。 :)

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

正则表达式101

(?:[QUOTE=)([^]]+)]([^[]+)(?:[/QUOTE])
  • (?:[QUOTE=)[QUOTE=匹配,其中?:的意思是"非捕获组"。
  • ([^]]+)匹配任何不是右方括号].
  • ]匹配右方括号]
  • ([^[]+)匹配任何不是左方括号[.
  • (?:[/QUOTE])[/QUOTE]匹配的"非捕获组"。

jsFiddle 1


更新/编辑:

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

第二部分将用</blockquote>替换所有[QUOTE]标签。

jsFiddle 2

var btnProcess = document.getElementById('process');
btnProcess.addEventListener('click', function() {
var data = document.getElementById('data-txt').value;
data = data.trim().replace(/r|n|rn/g, "<br>");
data = data.replace(/(?:[QUOTE=)([^]]+)]/gi, "<blockquote><strong>$1:</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>

最新更新