【问题标题】:regex for url some issue正则表达式的 url 一些问题
【发布时间】:2015-02-19 18:26:12
【问题描述】:

我编写了正则表达式来验证 url,它适用于大多数 url 我对于下面的 url 它不起作用:

我的正则表达式:

/^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([?=\/\w \.-]*)\/?$/

https://www.facebook.com/permalink.php?story_fbid=802451379821615&id=298161773583914&pnref=story

如何使其适用于所有网址

【问题讨论】:

  • 还需要为 javascript 工作

标签: javascript php regex


【解决方案1】:

我的理解是,满足每一个可能的有效 URL 都会让人头疼。然而,基于this resource,有一个非常简单的正则表达式可以处理大多数边缘情况。

@stephenhay 试试这个,无论如何它都适用于您的示例:

^(https?|ftp):\/\/[^\s/$.?#].[^\s]*$

【讨论】:

    【解决方案2】:

    您的正则表达式必须处理以下带有 ipv6、utf8 字符的情况...

    ipv4

    http://192.168.1.1/test.htm
    

    ipv6

    http://[2a00:1450:4007:806::1007]/!voilà
    

    国际人物

    http://bébé.fr/
    

    事实上,有很多复杂的可能性,所以更好的办法是测试协议和主机名:

    if (preg_match("#^(https?)://([^/]+)/#", $url, $out)) {
       if (gethostbyname($out[2])) {
         return 1;
       }
    }
    return 0;
    

    或者更简单的解决方案是不使用正则表达式,而是使用处理所有情况的 PHP parse_url() 函数。

    【讨论】:

      【解决方案3】:

      只用写正则表达式是没有意义的

      filter_var($url, FILTER_VALIDATE_URL);
      

      将值验证为 URL(根据 »http://www.faqs.org/rfcs/rfc2396),可选择使用必需的组件。请注意,有效的 URL 可能未指定 HTTP 协议 http://,因此可能需要进一步验证以确定 URL 使用预期的协议,例如ssh:// 或 mailto:。请注意,该函数只会查找有效的 ASCII URL;国际化域名(包含非 ASCII 字符)将失败。

      用于 JavaScript 检查

      https://code.google.com/p/google-caja/source/browse/trunk/src/com/google/caja/plugin/uri.js

      【讨论】:

        猜你喜欢
        • 2011-10-04
        • 1970-01-01
        • 2016-04-13
        • 2023-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多