gpt4 book ai didi

php - URL 检测和 BB-Style 标签(正则表达式,前瞻问题)

转载 作者:可可西里 更新时间:2023-10-31 23:49:03 26 4
gpt4 key购买 nike

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

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

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

我从找到的一段代码开始 here并做了一些补充。

这是非标记 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]

仍会在 http:// 之后匹配。

上面的正则表达式产生了以下匹配(用 http://gskinner.com/RegExr/ 测试,匹配是粗体。我不得不在 http:// 之后添加空格,因为我不允许发布更多网址):

www.example.com
http:// www.example.com
http:// example.com
[link http://www.example.com]no problem 1[/link]
[link www.example.com]no problem 2[/link]
[link http://www.example.com]http://www.example.com[/link]

我试过移动否定的前瞻性并使用括号(非常漫无目的地),但没有成功。

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

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

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

提前致谢!

最佳答案

我已经采用了您的正则表达式,将其与您提供的示例一起插入到 regexr 中并尝试使其工作。

一步一步:

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

[^\s()<>]+

这也会匹配左括号字符'[',因此匹配不会在遇到[/link]位时停止。可以说 [ 字符是一个有效的 URI 字符,但这只是在极少数情况下(有关更多信息,请参阅 this 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 .

关于php - URL 检测和 BB-Style 标签(正则表达式,前瞻问题),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15005621/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com