PHP过滤器\u验证\u URL TLD不需要

PHP过滤器\u验证\u URL TLD不需要,php,validation,Php,Validation,使用filter\u var($url,filter\u VALIDATE\u url)发现的问题是,当$url=“http://x”时,它返回true 不需要TLD。我如何解决这个问题,以便需要TLD?任何以方案开头的URI,如http://,然后包含有效的URI字符,根据以下中的官方URI规范,都是有效的: 每个URI都以第3.1节中定义的方案名称开头,该名称指的是在该方案中分配标识符的规范。因此,URI语法是一个联邦和可扩展的命名系统,其中每个方案的规范可以进一步限制使用该方案的标识符的语

使用
filter\u var($url,filter\u VALIDATE\u url)
发现的问题是,当
$url=“http://x”时,它返回true


不需要TLD。我如何解决这个问题,以便需要TLD?

任何以方案开头的URI,如http://
,然后包含有效的URI字符,根据以下中的官方URI规范,都是有效的

每个URI都以第3.1节中定义的方案名称开头,该名称指的是在该方案中分配标识符的规范。因此,URI语法是一个联邦和可扩展的命名系统,其中每个方案的规范可以进一步限制使用该方案的标识符的语法和语义

筛选器验证URL所做的操作是正确的

http://localhost
http://x
是完全有效的URI

如果您确实想要要求并验证TLD,那么您必须使用包含所有有效TLD的白名单。因为每个TLD在子域、二级域等方面都有所不同。 有顶级域、二级域和子域。从技术上讲,除TLD之外的所有内容都是子域

您可以在此处找到TLD的维护列表:

对于PHP实现(列表解析器):

在我看来,这个问题不能通过“regexp”或“主机名扫描中的点数”来解决。 一个例外:如果验证器的使用范围仅限于几个已知的URL,那么您可以使用这些策略来解决这个问题

有趣的是这里建议的MX记录检查:

参考


对于TLD验证,您需要使用的库。这里有两种不同的解决方案

首先,从技术上讲,它是TLD的唯一实际数据库

$store = new LayerShifter\TLDDatabase\Store();

$store->isICCAN('com'); // returns true
$store->isICCAN('co.uk'); // returns true
$store->isICCAN('example'); // returns false
如果您需要更智能的解决方案,我建议。它是可以用作验证程序的域解析器

$extract = new LayerShifter\TLDExtract\Extract();
$extract->setExtractionMode(Extract::MODE_ALLOW_ICCAN);

# For domain 'shop.github.com'

$result = $extract->parse('shop.github.com');
$result->getRegistrableDomain(); // will return 'github.com'
$result->getSuffix(); // will return 'com'    

# For domain 'shop.github.co.uk'

$result = $extract->parse('http://shop.github.co.uk');
$result->getRegistrableDomain(); // will return 'github.co.uk'
$result->getSuffix(); // will return 'co.uk'    

# For domain 'example.example'

$result = $extract->parse('https://example.example');
$result->getRegistrableDomain(); // will return NULL
$result->getSuffix(); // will return NULL

# For domain 'localhost'

$result = $extract->parse('localhost');
$result->getRegistrableDomain(); // will return NULL
$result->getSuffix(); // will return NULL

. 查看其中的所有链接,了解全面验证URL的其他策略。URL不一定需要TLD才能生效。你可以使用正则表达式。请看这里: