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 引号标签以及如何替换它们...那将不胜感激。
- 是的,我知道正则表达式可能不是解决此问题的最佳方法。 :)
正则表达式可能是这样的:
(?:\[QUOTE=)([^\]]+)\]([^\[]+)(?:\[\/QUOTE\])
(?:\[QUOTE=)
匹配 [QUOTE=
,其中 ?:
表示“非捕获组” .
([^\]]+)
匹配任何非右方括号 ]
.
\]
匹配右方括号 ]
.
([^\[]+)
匹配任何非左方括号 [
.
(?:\[\/QUOTE\])
匹配 [/QUOTE]
. 的“非捕获组”
Update/Edit:
现在为了匹配多个 nested [quote]
标签并将它们转换为 HTML,如果将上面的正则表达式分成两部分会更容易.第一部分替换所有出现的开头 [QUOTE=SOMEONE]
并将其替换为 <blockquote>SOMEONE:
.
第二部分会将所有 [\QUOTE]
标签替换为 </blockquote>
。
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>
我很难定位、捕获和替换一些跨越多行的 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 引号标签以及如何替换它们...那将不胜感激。
- 是的,我知道正则表达式可能不是解决此问题的最佳方法。 :)
正则表达式可能是这样的:
(?:\[QUOTE=)([^\]]+)\]([^\[]+)(?:\[\/QUOTE\])
(?:\[QUOTE=)
匹配[QUOTE=
,其中?:
表示“非捕获组” .([^\]]+)
匹配任何非右方括号]
.\]
匹配右方括号]
.([^\[]+)
匹配任何非左方括号[
.(?:\[\/QUOTE\])
匹配[/QUOTE]
. 的“非捕获组”
Update/Edit:
现在为了匹配多个 nested [quote]
标签并将它们转换为 HTML,如果将上面的正则表达式分成两部分会更容易.第一部分替换所有出现的开头 [QUOTE=SOMEONE]
并将其替换为 <blockquote>SOMEONE:
.
第二部分会将所有 [\QUOTE]
标签替换为 </blockquote>
。
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>