代码之家  ›  专栏  ›  技术社区  ›  Buhake Sindi Tesnep

使用正则表达式从javascript中的段落文本提取1个或多个超链接

  •  0
  • Buhake Sindi Tesnep  · 技术社区  · 15 年前

    很抱歉再次打扰你们,但这是我的困境。

    必须有一个“更好”的正则表达式来标识段落文本中的HTML链接(文本中可以有1个以上的HTML链接)。如何提取所有链接并将其锚定在JavaScript中?

    我的尝试(在javascript中)如下:

    var urlPattern = "(https?|ftp)://(www\\.)?(((([a-zA-Z0-9.-]+\\.){1,}[a-zA-Z]{2,4}|localhost))|((\\d{1,3}\\.){3}(\\d{1,3})))(:(\\d+))?(/([a-zA-Z0-9-._~!$&'()*+,;=:@/]|%[0-9A-F]{2})*)?(\\?([a-zA-Z0-9-._~!$&'()*+,;=:/?@]|%[0-9A-F]{2})*)?(#([a-zA-Z0-9._-]|%[0-9A-F]{2})*)?";
    
    function extractURLs(s) {
        return s.match(new RegExp(urlPattern));
    }
    
    //s is of type String
    
    //For testing...
    var text = "Check this video out http://ww w.youtube.com/watch?v=y3U3R3b1dOg or http://www.youtube.com/watch?v=sX6Vm0MoPCY";
    alert(extractURLs(text));
    

    (此处故意添加了超链接上的空格,以便在SO中发布问题)。 结果:我只得到第一个超链接,而不是第二个。 有人做过我能利用的类似或更好的事情吗?

    事先谢谢。

    3 回复  |  直到 14 年前
        1
  •  2
  •   Alsciende    15 年前

    使用“G”修饰语:

    function extractURLs(s) {
        return s.match(new RegExp(urlPattern, "g"));
    }
    
        2
  •  0
  •   stepanian    15 年前
    var urlPattern = "(https?|ftp)://(www\\.)?(((([a-zA-Z0-9.-]+\\.){1,}[a-zA-Z]{2,4}|localhost))|((\\d{1,3}\\.){3}(\\d{1,3})))(:(\\d+))?(/([a-zA-Z0-9-._~!$&'()*+,;=:@/]|%[0-9A-F]{2})*)?(\\?([a-zA-Z0-9-._~!$&'()*+,;=:/?@]|%[0-9A-F]{2})*)?(#([a-zA-Z0-9._-]|%[0-9A-F]{2})*)?";
    
    
    function extractURLs(s) {
        return s.match(new RegExp(urlPattern));
    }
    
    var text = "Check this video out http://www.youtube.com/watch?v=y3U3R3b1dOg or http://www.youtube.com/watch?v=sX6Vm0MoPCY";
    var results = extractURLs(text);
    
    alert(extractURLs(results[0]  + ", " + results[1])); 
    
        3
  •  0
  •   Livingston Samuel    15 年前

    最好把它写成,

    var urlPattern = /(https?|ftp)://(www\\.)?(((([a-zA-Z0-9.-]+\\.){1,}[a-zA-Z]{2,4}|localhost))|((\\d{1,3}\\.){3}(\\d{1,3})))(:(\\d+))?(/([a-zA-Z0-9-._~!$&'()*+,;=:@/]|%[0-9A-F]{2})*)?(\\?([a-zA-Z0-9-._~!$&'()*+,;=:/?@]|%[0-9A-F]{2})*)?(#([a-zA-Z0-9._-]|%[0-9A-F]{2})*)?/g;
    
    function extractURLs(s) {
        return s.match(urlPattern);
    }
    

    在这里 urlPattern 是预编译的,而不是每次调用函数时都编译regex,因此会导致性能不佳。