验证字符串是否为 FQDN (Codeigniter)

发布于 2024-10-11 12:28:10 字数 641 浏览 5 评论 0原文

我正在尝试使用 form_validation 使用自定义运行来验证域名:

function fqdn($str)
    {

        $CI =& get_instance();
        $CI->form_validation->set_message('fqdn','The %s is not a valid domain name.');

        $re1='((?:[a-z][a-z\\.\\d\\-]+)\\.(?:[a-z][a-z\\-]+))(?![\\w\\.])';
        if ($c=preg_match_all ("/".$re1."/is", $str, $matches)){

            return TRUE;
        }
        else{
            return FALSE;
        }
    }

除了我不希望它在地址中的任何位置以及存在 @ 的地方返回 true 之外,它的工作效果相对较好前导或尾随 - 我将如何更改代码以匹配。

另外,如果我应该做其他事情,这样我就可以确保分机是正确的,而不是一些编造的垃圾,那么我是否将这一切都错了。

感谢您抽出时间。

I'm trying to use form_validation to validate a domain name using a custom run:

function fqdn($str)
    {

        $CI =& get_instance();
        $CI->form_validation->set_message('fqdn','The %s is not a valid domain name.');

        $re1='((?:[a-z][a-z\\.\\d\\-]+)\\.(?:[a-z][a-z\\-]+))(?![\\w\\.])';
        if ($c=preg_match_all ("/".$re1."/is", $str, $matches)){

            return TRUE;
        }
        else{
            return FALSE;
        }
    }

This works relatively well apart from I dont want it to return true if there are @ anywhere in the address and also where there are leading or trailing -
How would I go about changing the code to match.

Also am I going about this all wrong should there be something else I should be doing so I can make sure that the ext are correct and not some made up garbage.

Thanks for your time.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

动次打次papapa 2024-10-18 12:28:10

好吧,我用的这个

function IsValidFQDN($FQDN) {
    return (!empty($FQDN) && preg_match('/(?=^.{1,254}$)(^(?:(?!\d|-)[a-z0-9\-]{1,63}(?<!-)\.)+(?:[a-z]{2,})$)/i', $FQDN) > 0);
}

不是我自己做的,而是取自 FQDN正则表达式并进行了一些编辑,使其不仅仅匹配主机名,例如。 我的主机
另请注意,它不匹配反向域名,如 123.213.in-addr.arpa

它会匹配任何 TLD,甚至是那些现在不存在但将来可能存在的域;)如 yoyo.mama

编辑:

警告!此正则表达式将拒绝以数字或国际域开头的域,因此它比要求的更严格。

well, I used this one

function IsValidFQDN($FQDN) {
    return (!empty($FQDN) && preg_match('/(?=^.{1,254}$)(^(?:(?!\d|-)[a-z0-9\-]{1,63}(?<!-)\.)+(?:[a-z]{2,})$)/i', $FQDN) > 0);
}

I didn't made this myself, but took from FQDN Regular Expression and edited a bit so it doesn't match just hostname eg. myhost
also take note that it doesn't match reverse domains like 123.213.in-addr.arpa

it will match any TLD, even those which doesn't exist now but might in future ;) like yoyo.mama

EDIT:

WARNING! This regexp will reject domains starting with a digit or international domains thus it's stricter than required.

水染的天色ゝ 2024-10-18 12:28:10

您可以通过执行以下操作从 IANA 文本文件中获取 TLD 的快速数组:

$tld_list = file('http://data.iana.org/TLD/tlds-alpha-by-domain.txt');
$tld_list = array_values(array_diff($tld_list, preg_grep('/^(#|XN--)/', $tld_list)));

它只是从 IANA.org 获取文本文件作为数组。然后删除未解析为英文字符 TLD 的注释和国际条目。我相信该文件会定期更新 - 日期位于文件顶部。但我不会向它发送垃圾邮件。

You can get a quick array of TLD's from IANA text file by doing something like this:

$tld_list = file('http://data.iana.org/TLD/tlds-alpha-by-domain.txt');
$tld_list = array_values(array_diff($tld_list, preg_grep('/^(#|XN--)/', $tld_list)));

It just gets the text file from IANA.org as array. Then removes the comments and international entries that aren't parsed into english character TLDs. I believe this file would be kept up to date on a regular basis - date is at the top of the file. I wouldn't spam it though.

软的没边 2024-10-18 12:28:10
function fqdn($str) {

        $CI =& get_instance();
        $CI->form_validation->set_message('fqdn','The %s is not a valid domain name.');

        $tld_list = array(
            'arp', 'com', 'edu', 'gov', 'int', 'mil', 'net', 'org',
            'aero', 'biz', 'coop', 'info', 'museum', 'name', 'pro', 'ws',
            'ac', 'ad', 'ae', 'af', 'ag', 'ai', 'al', 'am', 'an', 'ao', 'aq', 'ar', 'as',
            'at', 'au', 'aw', 'az', 'ba', 'bb', 'bd', 'be', 'bf', 'bg', 'bh', 'bi', 'bj',
            'bm', 'bn', 'bo', 'br', 'bs', 'bt', 'bv', 'bw', 'by', 'bz', 'ca', 'cc', 'cd',
            'cf', 'cg', 'ch', 'ci', 'ck', 'cl', 'cm', 'cn', 'co', 'cr', 'cu', 'cv', 'cx',
            'cy', 'cz', 'de', 'dj', 'dk', 'dm', 'do', 'dz', 'ec', 'ee', 'eg', 'eh', 'er',
            'es', 'et', 'fi', 'fj', 'fk', 'fm', 'fo', 'fr', 'ga', 'gd', 'ge', 'gf', 'gg',
            'gh', 'gi', 'gl', 'gm', 'gn', 'gp', 'gq', 'gr', 'gs', 'gt', 'gu', 'gw', 'gy',
            'hk', 'hm', 'hn', 'hr', 'ht', 'hu', 'id', 'ie', 'il', 'im', 'in', 'io', 'iq',
            'ir', 'is', 'it', 'je', 'jm', 'jo', 'jp', 'ke', 'kg', 'kh', 'ki', 'km', 'kn',
            'kp', 'kr', 'kw', 'ky', 'kz', 'la', 'lb', 'lc', 'li', 'lk', 'lr', 'ls', 'lt',
            'lu', 'lv', 'ly', 'ma', 'mc', 'md', 'mg', 'mh', 'mk', 'ml', 'mm', 'mn', 'mo',
            'mp', 'mq', 'mr', 'ms', 'mt', 'mu', 'mv', 'mw', 'mx', 'my', 'mz', 'na', 'nc',
            'ne', 'nf', 'ng', 'ni', 'nl', 'no', 'np', 'nr', 'nu', 'nz', 'om', 'pa', 'pe',
            'pf', 'pg', 'ph', 'pk', 'pl', 'pm', 'pn', 'pr', 'ps', 'pt', 'pw', 'py', 'qa',
            're', 'ro', 'ru', 'rw', 'sa', 'sb', 'sc', 'sd', 'se', 'sg', 'sh', 'si', 'sj',
            'sk', 'sl', 'sm', 'sn', 'so', 'sr', 'st', 'sv', 'sy', 'sz', 'tc', 'td', 'tf',
            'tg', 'th', 'tj', 'tk', 'tm', 'tn', 'to', 'tp', 'tr', 'tt', 'tv', 'tw', 'tz',
            'ua', 'ug', 'uk', 'um', 'us', 'uy', 'uz', 'va', 'vc', 've', 'vg', 'vi', 'vn',
            'vu', 'wf', 'ws', 'ye', 'yt', 'yu', 'za', 'zm', 'zw' );

        $label = '[\\w][\\w\\.\\-]{0,61}[\\w]';
        $tld = '[\\w]+';

        if($c=preg_match( "/^($label)\\.($tld)$/", $str, $match ) && in_array( $match[2], $tld_list )) {

            return TRUE;
        }
        else{
            return FALSE;
        }
    }

如果有人想知道的话:)

function fqdn($str) {

        $CI =& get_instance();
        $CI->form_validation->set_message('fqdn','The %s is not a valid domain name.');

        $tld_list = array(
            'arp', 'com', 'edu', 'gov', 'int', 'mil', 'net', 'org',
            'aero', 'biz', 'coop', 'info', 'museum', 'name', 'pro', 'ws',
            'ac', 'ad', 'ae', 'af', 'ag', 'ai', 'al', 'am', 'an', 'ao', 'aq', 'ar', 'as',
            'at', 'au', 'aw', 'az', 'ba', 'bb', 'bd', 'be', 'bf', 'bg', 'bh', 'bi', 'bj',
            'bm', 'bn', 'bo', 'br', 'bs', 'bt', 'bv', 'bw', 'by', 'bz', 'ca', 'cc', 'cd',
            'cf', 'cg', 'ch', 'ci', 'ck', 'cl', 'cm', 'cn', 'co', 'cr', 'cu', 'cv', 'cx',
            'cy', 'cz', 'de', 'dj', 'dk', 'dm', 'do', 'dz', 'ec', 'ee', 'eg', 'eh', 'er',
            'es', 'et', 'fi', 'fj', 'fk', 'fm', 'fo', 'fr', 'ga', 'gd', 'ge', 'gf', 'gg',
            'gh', 'gi', 'gl', 'gm', 'gn', 'gp', 'gq', 'gr', 'gs', 'gt', 'gu', 'gw', 'gy',
            'hk', 'hm', 'hn', 'hr', 'ht', 'hu', 'id', 'ie', 'il', 'im', 'in', 'io', 'iq',
            'ir', 'is', 'it', 'je', 'jm', 'jo', 'jp', 'ke', 'kg', 'kh', 'ki', 'km', 'kn',
            'kp', 'kr', 'kw', 'ky', 'kz', 'la', 'lb', 'lc', 'li', 'lk', 'lr', 'ls', 'lt',
            'lu', 'lv', 'ly', 'ma', 'mc', 'md', 'mg', 'mh', 'mk', 'ml', 'mm', 'mn', 'mo',
            'mp', 'mq', 'mr', 'ms', 'mt', 'mu', 'mv', 'mw', 'mx', 'my', 'mz', 'na', 'nc',
            'ne', 'nf', 'ng', 'ni', 'nl', 'no', 'np', 'nr', 'nu', 'nz', 'om', 'pa', 'pe',
            'pf', 'pg', 'ph', 'pk', 'pl', 'pm', 'pn', 'pr', 'ps', 'pt', 'pw', 'py', 'qa',
            're', 'ro', 'ru', 'rw', 'sa', 'sb', 'sc', 'sd', 'se', 'sg', 'sh', 'si', 'sj',
            'sk', 'sl', 'sm', 'sn', 'so', 'sr', 'st', 'sv', 'sy', 'sz', 'tc', 'td', 'tf',
            'tg', 'th', 'tj', 'tk', 'tm', 'tn', 'to', 'tp', 'tr', 'tt', 'tv', 'tw', 'tz',
            'ua', 'ug', 'uk', 'um', 'us', 'uy', 'uz', 'va', 'vc', 've', 'vg', 'vi', 'vn',
            'vu', 'wf', 'ws', 'ye', 'yt', 'yu', 'za', 'zm', 'zw' );

        $label = '[\\w][\\w\\.\\-]{0,61}[\\w]';
        $tld = '[\\w]+';

        if($c=preg_match( "/^($label)\\.($tld)$/", $str, $match ) && in_array( $match[2], $tld_list )) {

            return TRUE;
        }
        else{
            return FALSE;
        }
    }

In case anyone whats to know :)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文