jQuery regex over multi-line(dotall)?

时间:2017-05-16 04:05:07

标签: jquery multiline

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

特别是[QUOTE]代码..

我已阅读/搜索并了解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]部分..

捕获&#34; SOMENAME&#34;在[QUOTE= ]部分..以及两个[quote]标记之间的文字。

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

\[quote=(.*?)\]

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

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

我如何才能正确地定位引用部分并正确地捕获两组...当它跨越多行时?

修改/更新

好像我在摸索正在运行的正则表达式解决方案时看起来很好。

发布与他人分享这种方法对我有用。 (我确定其他方法吗?)

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

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

但是,如果有人可以帮助解决多个NESTED报价标签以及如何替换它们......那就太受欢迎了。

  • 是的,我理解正则表达式可能不是解决这个问题的最好方法。 :)

1 个答案:

答案 0 :(得分:1)

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

Regex101

(?:\[QUOTE=)([^\]]+)\]([^\[]+)(?:\[\/QUOTE\])
  • (?:\[QUOTE=) 匹配[QUOTE=,其中 ?: 表示&#34;非捕获组&#34;。
  • ([^\]]+) 匹配任何不是结束方括号 ] 的内容。
  • \] 匹配结束方括号 ]
  • ([^\[]+) 匹配任何不是开头方括号 [ 的内容。
  • (?:\[\/QUOTE\]) a&#34;非捕获组&#34;匹配[/QUOTE]

jsFiddle 1

更新/编辑:

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

第二部分将用[\QUOTE]替换所有</blockquote>代码。

jsFiddle 2

&#13;
&#13;
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>$1:</strong><br>");
  data = data.replace(/\[\/QUOTE\]/ig, '</blockquote>');
  document.getElementById('result').innerHTML = data;
});
&#13;
blockquote {
  margin: 10px; padding: 5px; background-color: #eee; border: 1px dashed grey;
}
blockquote blockquote { background-color: #f1f1f1; }
blockquote blockquote blockquote { background-color: #f5f5f5; }
&#13;
<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>
&#13;
&#13;
&#13;