【问题标题】:PHP: Check that a string doesn't contain any special characters but periodsPHP:检查字符串是否包含任何特殊字符但句点
【发布时间】:2013-06-03 16:34:09
【问题描述】:

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

一个通用的解决方案可能是 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。点数不是恒定的。

【问题讨论】:

  • 显示您将收到的数据格式示例。喜欢 111.111.111.111
  • 你可以使用filter_var($url, FILTER_VALIDATE_URL)
  • 可能的输入示例:典型的 ip 地址:111.111.111.111,域名:somestring.computername.com 或 computername.com
  • ...点数不固定

标签: php regex string dns


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    对于域:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 这看起来很有趣。我要先试试这个。谢谢!
      • 不幸的是,这似乎对我不起作用,因为它不允许没有协议定义 http、ftp 等的地址...在我的情况下,可能的输入是 fe 111.111.111.111 和 dev.mydomain。 tm.com。我还为 IP 地址找到了一个过滤器,但我仍然需要在没有给出协议的情况下验证域名。 :)
      • 酷。不过,请查看其他验证器,这可能会有所帮助:php.net/manual/en/filter.filters.validate.php。取决于您的业务规则,但我通常会在存储之前添加协议,所以这对我有用。祝你好运!
      • 感谢您的帮助。我最终最终将 FILTER_VALIDATE_URL 和 FILTER_VALIDATE_IP 与 preg_match 一起使用
      猜你喜欢
      • 2010-12-20
      • 2016-08-24
      • 2016-08-01
      • 2014-11-25
      • 2021-11-21
      • 1970-01-01
      • 1970-01-01
      • 2023-04-05
      • 1970-01-01
      相关资源
      最近更新 更多