正则表达式检查.com之后的有效性

时间:2013-11-26 12:56:25

标签: javascript php regex

这些年来,我在javascript以及php中使用此regEx来检查有效的域名。

原始版

/^((http|https):\/{2})([w]{3})([\.]{1})([a-zA-Z0-9-]{2,63})([\.]{1})((a[cdefgilmnoqrstuwxz]|aero|arpa)|(b[abdefghijmnorstvwyz]|biz)|(c[acdfghiklmnorsuvxyz]|cat|co.in|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

更改了损坏的版本

我添加了最后一部分,以便它可以接受并验证.com之后的内容。但是我发现它以某种方式打破了整个事情并且任何事情都进入了。我如何才能正确理解这一点?

/^((http|https):\/{2})([w]{3})([\.]{1})([a-zA-Z0-9-]{2,63})([\.]{1})((a[cdefgilmnoqrstuwxz]|aero|arpa)|(b[abdefghijmnorstvwyz]|biz)|(c[acdfghiklmnorsuvxyz]|cat|co.in|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])([-A-Za-z0-9+&@#\/%=~_|:.]{0,51})$/i

RegEx工作正常。这只是我添加的最后一部分似乎导致问题([-A-Za-z0-9+&@#\/%=~_|:.]{0,51})

我在这里要做的是验证.com之后的部分。例如,此问题的.com之后的部分是questions/20217720/regex-to-check-for-validity-of-whats-after-the-com。这是我试图验证的部分。但是现在tlds没有验证。

实施例: http://www.example.com应验证为真

http://www.example.com/也应验证为真

http://www.example.com/mail应验证为真

http://www.example.comxx应验证为false

http://www.example.comxx/mail应验证为false

3 个答案:

答案 0 :(得分:1)

这适合您的需求:

(\/[-A-Za-z0-9+&@#\/%=~_|:.]{0,50})?

整个群组是可选的,但如果在TLD之后出现任何内容,那么它需要/作为第一个角色(减少51到50来补偿)。

完整的正则表达式:

/^((http|https):\/{2})([w]{3})([\.]{1})([a-zA-Z0-9-]{2,63})([\.]{1})((a[cdefgilmnoqrstuwxz]|aero|arpa)|(b[abdefghijmnorstvwyz]|biz)|(c[acdfghiklmnorsuvxyz]|cat|co.in|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])(\/[-A-Za-z0-9+&@#\/%=~_|:.]{0,50})?$/i

RegExr Example

答案 1 :(得分:0)

对于PHP,您可以使用parse_urldocumentation)作为替代方案。

<?php
    $info = parse_url($url);

    // is .com domain
    if(end(explode('.', $info['host'])) == "com"){
        $behinddotcom = $info['path'] . '?' . $info['query'];
    }
?>

答案 2 :(得分:0)

TLD之后是路径/文件名。除非您有任何特殊情况或规则要遵守,否则无需验证。

如果您只是需要提取它,这是一件简单的事情。在例如你会做的JavaScript

window.location.pathname // returns "/questions/20217720/regex-to-check-for-validity-of-whats-after-the-com"