【问题标题】:PHP RegEx for "Website Name"“网站名称”的 PHP 正则表达式
【发布时间】:2010-10-25 07:57:57
【问题描述】:

重复:PHP validation/regex for URL

我的目标是为网站名称创建一个 PHP 正则表达式。正则表达式用于潜在客户收集表单,并且应该接受某人可能输入的任何合法类型的网站名称语法。经过详尽的搜索,我很惊讶我找不到一个。

这是我正在寻找的正则表达式匹配:

而且,它也应该匹配:

  • 以上任何一个带有尾部反斜杠的,例如:somewebsite.com/
  • 子域

【问题讨论】:

  • 你说的是网站地址,而不是他们的名字。

标签: php regex dns


【解决方案1】:

不需要正则表达式。

$subject = 'example.com';
$part = (stripos($subject, 'http://') === FALSE)  ? 'http://' : '' ;
var_dump(filter_var($part.$subject, FILTER_VALIDATE_URL));

【讨论】:

  • 你少了一个近亲!
  • 请注意,这仅适用于 PHP 5.2+
  • 这个很有用,但是和下面的不匹配:somewebsite.com
  • 安迪,在发布之前测试你的代码。结果为 FALSE。不过我投票给你是因为正则表达式被过度使用它太疯狂了。
【解决方案2】:

我决定在这里对答案进行基准测试,以证明正则表达式不是此类简单任务的答案。 Andy Leekman 的代码比其他答案快 30% 到 60%。他确实有一个错误,但我用一行代码修复了它。您可以在下面查看我的结果。

这是运行测试的代码。

http://pastie.org/476900

alt text http://img254.imageshack.us/img254/7821/capturevzh.png

PS如果其他人使用正则表达式来验证 URL,我可能会发疯;)

【讨论】:

    【解决方案3】:

    您可能需要对其进行调整:

    <?php
    
    $pattern = '/^(([\w]+:)?\/\/)?(([\d\w]|%[a-fA-f\d]{2,2})+(:([\d\w]|%[a-fA-f\d]{2,2})+)?@)?([\d\w][-\d\w]{0,253}[\d\w]\.)+[\w]{2,4}(:[\d]+)?(\/([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)*(\?(&amp;?([-+_~.\d\w]|%[a-fA-f\d]{2,2})=?)*)?(#([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)?$/';
    
    $url1  = "http://www.somewebsite.com";
    $url2  = "https://www.somewebsite.com";
    $url3  = "https://somewebsite.com";
    $url4  = "www.somewebsite.com";
    $url5  = "somewebsite.com";
    
    function valURL($pattern, $url) {
    
            $return = false;
    
            if(preg_match($pattern, $url)) {
                    $return = true;
            }
    
            if($return == true) {
                    echo "Match URL: <font color='green'>" . $url . "</font><br /><br />";
            } else {
                    echo "Try Again: <font color='red'>URL: " . $url . "</font><br /><br />";
            }
    }
    
    valURL($pattern, $url1);
    valURL($pattern, $url2);
    valURL($pattern, $url3);
    valURL($pattern, $url4);
    valURL($pattern, $url5);
    
    ?>
    

    【讨论】:

    【解决方案4】:
    ^(https?://)?(([0-9a-z_!'().&=$%-]: )?[0-9a-z_!'().&=$%-]@)?(([0-9]{1,3}\.){3}[0-9]{1,3}|([0-9a-z_!'()-]\.)([0-9a-z][0-9a-z-]{0,61})?[0-9a-z]\.[a-z]{2,6})(:[0-9]{1,4})?((/?)|(/[0-9a-z_!*'().;?:@&=$,%#-])/?)$
    

    【讨论】:

    • 我无法让您的代码正常工作。能否提供一个简单的使用示例?
    • $pattern = /^(https?://)?(([0-9a-z_!'().&=$%-]: )?[0-9a-z_! '().&=$%-]@)?(([0-9]{1,3}\.){3}[0-9]{1,3}|([0-9a-z_! '()-]\.)([0-9a-z][0-9a-z-]{0,61})?[0-9a-z]\.[az]{2,6})( :[0-9]{1,4})?((/?)|(/[0-9a-z_!*'().;?:@&=$,%#-])/?)$ /
    • 对不起,但仍然不适合我。这就是我正在尝试的。有什么建议吗? $some_url = 'some-url.com'; $pattern = "/^(https?://)?(([0-9a-z_!'().&=$%-]: )?[0-9a-z_!'().&=$ %-]@)?(([0-9]{1,3}\.){3}[0-9]{1,3}|([0-9a-z_!'()-]\. )([0-9a-z][0-9a-z-]{0,61})?[0-9a-z]\.[az]{2,6})(:[0-9]{ 1,4})?((/?)|(/[0-9a-z_!*'().;?:@&=$,%#-])/?)$/"; if(preg_match($pattern, $some_url)) { echo "valid"; } else { 回声“无效”; }
    【解决方案5】:
    /^([a-z0-9]([-a-z0-9]*[a-z0-9])?\\.)+((a[cdefgilmnoqrstuwxz]|aero|arpa)|(b[abdefghijmnorstvwyz]|biz)|(c[acdfghiklmnorsuvxyz]|cat|com|coop)|d[ejkmoz]|(e[ceghrstu]|edu)|f[ijkmor]|(g[abdefghilmnpqrstuwy]|gov)|h[kmnrtu]|(i[delmnoqrst]|info|int)|(j[emop]|jobs)|k[eghimnprwyz]|l[abcikrstuvy]|(m[acdghklmnopqrstuvwxyz]|mil|mobi|museum)|(n[acefgilopruz]|name|net)|(om|org)|(p[aefghklmnrstwy]|pro)|qa|r[eouw]|s[abcdeghijklmnortvyz]|(t[cdfghjklmnoprtvwz]|travel)|u[agkmsyz]|v[aceginu]|w[fs]|y[etu]|z[amw])$/i
    

    http://www.shauninman.com/archive/2006/05/08/validating_domain_names

    由谷歌提供。虽然它非常复杂,所以其他人可能有一个更简单的。

    编辑:首先尝试安迪的答案。如果你能找到正则表达式的替代品,9/10 的替代品会更好。

    【讨论】:

    • 这个很有用,但是和下面的不匹配:somewebsite.com
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-21
    • 1970-01-01
    • 2016-01-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多