我很难定位,捕获和替换一些跨越几行的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>