【问题标题】:Regex to convert URL to Links正则表达式将 URL 转换为链接
【发布时间】:2012-06-19 06:39:29
【问题描述】:

我从这个网站“借用”了一个正则表达式:http://daringfireball.net/2010/07/improved_regex_for_matching_urls,这几乎是完整的,但我想匹配 exemple.com
我知道stackoverflow不是doyourhomework.com,但我思考了很长时间没有结果。这是一个要测试的小提琴:http://jsfiddle.net/BGnMm/25/,你可以在最后看到 exemple.com 不是链接。

var reg=/\b((?:[a-z][\w-]+:(?:\/*)|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))/gi;
var allurl="http:foo.com/blah_blah http://foo.com/blah_blah/ (Something like http://foo.com/blah_blah) http://foo.com/blah_blah_(wikipedia) http://foo.com/more_(than)_one_(parens) (Something like http://foo.com/blah_blah_(wikipedia)) http://foo.com/blah_(wikipedia)#cite-1 http://foo.com/blah_(wikipedia)_blah#cite-1 http://foo.com/unicode_(✪)_in_parens http://foo.com/(something)?after=parens http://foo.com/blah_blah. http://foo.com/blah_blah/. <http://foo.com/blah_blah> <http://foo.com/blah_blah/> http://foo.com/blah_blah, http://www.extinguishedscholar.com/wpglob/?p=364. http://✪df.ws/1234 rdar://1234 rdar:/1234 x-yojimbo-item://6303E4C1-6A6E-45A6-AB9D-3A908F59AE0E message://%3c330e7f840905021726r6a4ba78dkf1fd71420c1bf6ff@mail.gmail.com%3e http://➡.ws/䨹 www.c.ws/䨹 <tag>http://example.com</tag> Just a www.example.com link. http://example.com/something?with,commas,in,url, but not at end What about <mailto:gruber@daringfireball.net?subject=TEST> (including brokets). mailto:name@example.com bit.ly/foo “is.gd/foo/” WWW.EXAMPLE.COM http://www.asianewsphoto.com/(S(neugxif4twuizg551ywh3f55))/Web_ENG/View_DetailPhoto.aspx?PicId=752 http://www.asianewsphoto.com/(S(neugxif4twuizg551ywh3f55)) http://lcweb2.loc.gov/cgi-bin/query/h?pp/horyd:@field(NUMBER+@band(thc+5a46634)) 6:00p filename.txt http://example.com/quotes-are-“part” ✪df.ws/1234 example.com example.com/";
document.write(allurl.replace(reg,"<a href='$1' >$1</a><br />"));

【问题讨论】:

  • 请在问题中包含您的代码以供将来参考。我已经更新了它,但链接应该是次要的(如果这个链接被删除了怎么办)......另外,你想做什么?
  • 如果这是作业,你应该添加“作业”标签。
  • 我只是说这不是家庭作业
  • 我正在尝试更改正则表达式,以便匹配 exemple.com

标签: javascript regex


【解决方案1】:

{2,4}\/之后添加一个交替运算符(|),即

    var reg=/\b((?:[a-z][\w-]+:(?:\/*)|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/|)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))/gi;

您应该了解这一点。第一个未捕获的组(?: … ) 查找 URL 的“指示符”。例如,一个指示符是www(后跟最多 3 位数字)。然而,您正在寻求一种方法来识别 URL,根本没有任何指示符。因此,我们在上面所做的是添加了一个子句“or an empty match”作为“有效”指示符。 这样做的结果是您的正则表达式现在的选择性降低了:各种字符串,不仅是 example.com,还有 filename.txt 3.141593omg...really 被标识为 URL! 您唯一的其他(现成的)选项是对后缀更具选择性,例如需要特定的后缀 (com|org|net),但这会破坏原始正则表达式的一般性,它根本没有指定任何后缀。

换句话说,您可能面临逻辑的限制,而不是正则表达式编写技能或正则表达式语言本身的限制。

【讨论】:

  • +1。您的示例说明了为什么不应添加此类内容,IMO example.com 不应作为 URL 链接。如果 OP 想将其链接为 url,只需添加 http:// 协议,如 http://example.com。例如,如果要在论坛版块中实现这种自动 URL 识别,则用户的帖子将包含许多无意(并且可能损坏)的链接。按照您的建议定义后缀可能是一种解决方法。
【解决方案2】:

请检查是否

var reg=/\b((?:[a-z][\w-]+:(?:\/*)|(?:www\d{0,3}[.])|[a-z0-9.\-]+[.][a-z]{2,4}\/{0,1})(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))*(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))/gi;

适合您的需求。 www(anyNumber) 刚刚出现一或零次。抱歉第一个答案,没有注意到文字。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-06
    • 2013-04-23
    相关资源
    最近更新 更多