PHP:检查字符串是否包含任何特殊字符但不包含句点

时间:2013-06-07 11:21:55

标签: php regex string dns

我需要检查字符串是否是有效的域名或主机地址。这是因为我需要阻止来自给定字符串的所有不友好的命令。

一个通用解决方案可能是ping给定地址并查看它是否有响应但不幸的是在我的情况下这不是一个选项。

我认为可能的字符是A-Z,a-z,所有数字和点'。'所以preg_match函数可能是一种方法。我对正则表达式的了解大约为零,但我设法找出以下行来检查除点之外的所有其他内容。

preg_match("/([a-zA-Z0-9])/", $mystring);

那么你们可以帮我解决正确的正则表达式语法以允许上面提到的字符吗?或者,如果你想出一个更好的解决方案来阻止可能出现的安全问题(字符串将最终出现在shell_exec函数中,所以它非常关键)请吐出来。谢谢! :)

编辑:因此可能的输入是例如典型的IP地址:123.123.123.123或域名mydomain.com或corp.mydomain.xx.com。点数不是恒定的。

3 个答案:

答案 0 :(得分:1)

我使用PHP过滤器来检查域名或主机是否有效。不确定它是否能满足您的一切需求:

filter_var($urlToFilter, FILTER_VALIDATE_URL) !== false)

答案 1 :(得分:0)

域名

[a-zA-Z0-9][a-zA-Z0-9\-]*\.([a-zA-Z]{2,})

答案 2 :(得分:0)

dKen建议使用过滤器与以下preg_matches一起使用:

$chars = preg_match("/^([a-z\d](-*[a-z\d])*)(\.([a-z\d](-*[a-z\d])*))*$/i", $domain_name); //valid chars check
$length = preg_match("/^.{1,253}$/", $domain_name); //overall length check
$labels = preg_match("/^[^\.]{1,63}(\.[^\.]{1,63})*$/", $domain_name); //length of each label