【问题标题】:PHP - Validating Domains with wilcards and/or subdomainsPHP - 使用通配符和/或子域验证域
【发布时间】:2013-03-27 13:38:56
【问题描述】:

我正在尝试用 PHP 编写一个验证脚本,该脚本将与我的网站提供的 API 一起使用。这个想法是用户将进入他们的 API 应该工作的所有域,防止竞争对手将代码放在他们的网站上。我只是想验证输入的域的格式是否有效

应允许以下域类型:

  • xyz.domain.xxxx
  • *.domain.xxxx
  • 域名.xxxx

我四处搜索,发现的代码 sn-ps(123)倾向于将所有域简化为最简单的形式,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 regex


【解决方案1】:

这应该验证域(使用通配符)

'/^(?!.{254,})(?!.*[^.]{64,})(?!.*\*\*)([a-z0-9*](?>[a-z0-9-*]*[a-z0-9*])?)(?>\.(?1)){1,126}$/iD'

将允许仅限 TLD 域(根据要求删除),或仅允许使用 *

不允许连续的*s。

如果上述方法不起作用,则可能是您使用的是旧版本的 PHP(以及旧版本的 PCRE)。以下应该可以解决该问题:

'/^(?!.{254,})(?!.*[^.]{64,})(?!.*\*\*)[a-z0-9*](?>[a-z0-9-*]*[a-z0-9*])?(?>\.[a-z0-9*](?>[a-z0-9-*]*[a-z0-9*])?){1,126}$/iD'

【讨论】:

  • 谢谢,但我得到了这个:preg_match(): Compilation failed: unrecognized character after (? at offset 80 on line 5 参见示例:codepad.org/alRevMYZ
  • 那么它应该可以工作。你确定你复制正确吗?见:phpfiddle.org/main/code/fib-89a
  • 查看演示 - 也许我确实错过了一些东西,但复制和粘贴通常是正确的。 codepad.org/alRevMYZ
  • uz 就是这样一个域(您可能需要使用uz. 来破解浏览器)
  • 是的,很少。您可以在 TLD 列表上运行 checkdnsrr($domain, 'A')checkdnsrr($domain, 'AAAA')(我不确定其他哪些记录类型是相关的)并查看哪些返回 true。尽管如果控制它们的人决定让它们可访问,这些可能会改变——ai 是另一个有效的方法。
【解决方案2】:

非常直接,无需对不同部分进行太多测试,但一般模式。

^([\w*]+\.)?([\w-]+)(\.\w+)$

【讨论】:

  • 那只允许a.b.cwww.del.icio.us 呢?此外,允许前导和尾随连字符,并且不限制标签或域的长度。
  • 就像我说的,没有太多测试,但直接涵盖了 OP 显示的案例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-28
  • 2014-06-12
  • 2017-04-30
  • 2013-09-20
  • 1970-01-01
  • 2020-08-23
  • 2020-10-08
相关资源
最近更新 更多