【发布时间】:2013-03-27 13:38:56
【问题描述】:
我正在尝试用 PHP 编写一个验证脚本,该脚本将与我的网站提供的 API 一起使用。这个想法是用户将进入他们的 API 应该工作的所有域,防止竞争对手将代码放在他们的网站上。我只是想验证输入的域的格式是否有效
应允许以下域类型:
- xyz.domain.xxxx
- *.domain.xxxx
- 域名.xxxx
我四处搜索,发现的代码 sn-ps(1、2、3)倾向于将所有域简化为最简单的形式,domain.com,但似乎没有考虑通配符或子域 - 或者看起来与我正在寻找的操作有点不同。
我希望有一天能够掌握正则表达式。
提前致谢!
更新:解决方案
我最终使用了拒绝 TLD 的 RegEx - 如果 preg_match 失败,我会在域上运行 DNS 检查,作为验证 TLD 的安全网。这样可以防止人们进入像MyNameIsFred这样的垃圾
$domain = str_replace('http://', '', strtolower($_REQUEST['domain']));
//Not checking TLDs. Instead if the domain fails, we will check DNS records to see if it is a TLD or somehow otherwise exists.
/* $reg = '/^(?!.{254,})(?!.*[^.]{64,})(?!.*\*\*)([a-z0-9*](?>[a-z0-9-*]*[a-z0-9*])?)(?>\.(?1)){0,126}$/iD'; //TLD domains OK */
$reg = '/^(?!.{254,})(?!.*[^.]{64,})(?!.*\*\*)[a-z0-9*](?>[a-z0-9-*]*[a-z0-9*])?(?>\.[a-z0-9*](?>[a-z0-9-*]*[a-z0-9*])?){1,126}$/iD'; //No TLD
if (preg_match($reg, $domain)!=1) {
if (!checkdnsrr($domain.'.', 'A') && !checkdnsrr($domain.'.', 'AAAA'))
//ERROR
}
//SUCCESS
【问题讨论】:
-
这不是你要找的,所以不是这个问题的答案,但值得了解:php.net/manual/en/filter.filters.validate.php
-
你是对的 - 不会真正帮助,但很高兴知道。谢谢