URL检测和BB样式标签(regex,前瞻性问题)


URL detection and BB-Style tags (regex, look-ahead issue)

所以我正在构建一个小型CMS,我希望避免在内容编辑器中允许使用HTML。出于这个原因,我想检测文本中的原始URL,并支持类似BB的标签,以便更好地进行自定义。

www.example.com
[link http://www.example.com]Click me[/link]

不幸的是,我对正则表达式还很陌生,而且我似乎无法做到这一点。我在字符串上运行两个正则表达式:第一个检测原始URL,第二个类似BB的URL。后者似乎工作得很好,但第一个会干扰,并且也会转换包装在标签中的URL。

我从这里找到的一段代码开始,并添加了一些内容。

这是非标签URL的代码:

/* don't match URLs preceeded by '[link ' */
(?<!'[link's)
(
    /* match all combinations of protocol and www. */
    ('bhttps?://www'.|'bhttps?://|(?<!//)'bwww'.)
    /* match URL (no changes made here) */
    ([^'s()<>]+(?:'(['w'd]+')|([^[:punct:]'s]|/)))
    /* but don't match if followed by [/link] - THIS DOESN'T WORK */
    (?!'[/link'])
)

www.之前的否定表情是存在的,因为/不是一个单词字符,没有它就有点像

 [link http://www.example.com]example[/link]

将在CCD_ 3之后仍然匹配。

上面的regex生成以下匹配项(使用http://gskinner.com/RegExr/,匹配项位于粗体中。我不得不在http://后面添加空格,因为我不允许发布更多的URL):

www.example.com
http://www.example.com
http://example.com
[链接http://www.example.com]没有问题1[/link]
[link www.example.com]没问题2[/link]
[链接http://www.example.com]http://www.example.com[/link]

我试着把消极的观点向前看,并玩括号(相当漫无目的),但没有成功。

为了完整起见,下面是标签匹配正则表达式(似乎有效):

(?:'[link's)('bhttps?://|'bwww'.|'bhttps?://www'.)([^'s()<>]+(?:'(['w'd]+')|([^[:punct:]'s]|/)))'](.*)(?:'[/link'])

我相信有人能立即发现错误。

提前感谢!

我已经获取了您的regex,用您给出的示例将其插入到regexr中,并试图使其工作。

逐步:

1) 原始正则表达式:http://regexr.com?33snj.为什么这个正则表达式也匹配[/link]的问题在于URL匹配位:

[^'s()<>]+

这也将匹配开括号字符"[",因此匹配在遇到[/link]位时不会停止。可以说[字符是一个有效的URI字符,但这只是在极少数情况下(更多信息请参阅这篇stackoverflow文章)

2) 我决定继续使用正则表达式,但在否定字符列表中添加了开括号字符:

[^'s()<>[]+

这会让你陷入另一个问题。看见http://regexr.com?33snp.由于回溯,引擎现在找到了一种方法来绕过最后的负面展望。

3) 一旦您使URL匹配组成为原子组(通过将?>添加到捕获组的开头),引擎就会停止回溯,我们就得到了所需的结果。

(?<!'[link's)(('bhttps?://www'.|'bhttps?://|(?<!//)'bwww'.)(?>[^'s()<>[]+(?:'(['w'd]+')|([^[:punct:]'s]|/)))(?!'[/link']))

在行动中看到它http://regexr.com?33sns.