【发布时间】:2014-02-02 20:16:45
【问题描述】:
我正在使用 UrlLinker https://bitbucket.org/kwi/urllinker/src 来匹配我网站上 cmets 中的 URL
自从我第一次使用它以来,它对我来说效果很好,但是它不适用于这个链接
http://example.com/files/213913702712nqh%297cwGb$_1D_e.jpg
此链接匹配到% 符号,其余部分保留为纯文本:
<a href="http://example.com/files/213913702712nqh">http://example.com/files/213913702712nqh</a>%297cwGb$_1D_e.jpg
如何修改正则表达式以匹配% 符号?因为那个 URL 是有效的。
这是正则表达式
{\b(https?://|ftp://)?(?:([^]\\\x00-\x20\"(),:-<>[\x7f-\xff]{1,64})(:[^]\\\x00-\x20\"(),:-<>[\x7f-\xff]{1,64})?@)?((?:[-a-zA-Z0-9]{1,63}\.)+[a-zA-Z][-a-zA-Z0-9]{1,62}|(?:[1-9][0-9]{0,2}\.|0\.){3}(?:[1-9][0-9]{0,2}|0))((:[0-9]{1,5})?(/[!$-/0-9:;=@_':;!a-zA-Z\x7f-\xff]*?)?(\?[!$-/0-9:;=@_':;!a-zA-Z\x7f-\xff]+?)?(#[!$-/0-9:;=@_':;!a-zA-Z\x7f-\xff]+?)?)(?=[)'?.!,;:]*([^-_$+.!*'(),;/?:@=&a-zA-Z0-9]|$))}{\b(https?://|ftp://)?(?:([^]\\\x00-\x20\"(),:-<>[\x7f-\xff]{1,64})(:[^]\\\x00-\x20\"(),:-<>[\x7f-\xff]{1,64})?@)?((?:[-a-zA-Z0-9]{1,63}\.)+[a-zA-Z][-a-zA-Z0-9]{1,62}|(?:[1-9][0-9]{0,2}\.|0\.){3}(?:[1-9][0-9]{0,2}|0))((:[0-9]{1,5})?(/[!$-/0-9:;=@_':;!a-zA-Z\x7f-\xff]*?)?(\?[!$-/0-9:;=@_':;!a-zA-Z\x7f-\xff]+?)?(#[!$-/0-9:;=@_':;!a-zA-Z\x7f-\xff]+?)?)(?=[)'?.!,;:]*([^-_$+.!*'(),;/?:@=&a-zA-Z0-9]|$))}
【问题讨论】:
-
通过快速浏览源代码,看起来
$rexPath = '(/[!$-/0-9:;=@_\':;!a-zA-Z\x7f-\xff]*?)?';不允许使用“%”字符,这可以解释为什么它只匹配您网址中的那个字符。我只需将它添加到“[]”之间的任何位置。事实上,我也允许$rexQuery和$rexFragment使用它。
标签: javascript php regex url