【问题标题】:Validate a domain name with GET parameters using a REGEX使用 REGEX 验证带有 GET 参数的域名
【发布时间】:2023-04-01 13:40:01
【问题描述】:

我正在尝试验证一个域是否有带有 preg_match 和一个 REGEX 的 GET 参数,我要求它具有我的目的。

我的工作是验证没有 GET 参数的域,如下所示:

if (preg_match("/^[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}$/", 'domain.com')) {
        echo 'true';
} else {
        echo 'false';
}

我对这个测试是正确的。

到目前为止一切顺利。我遇到的问题是添加 GET 参数,在我尝试过的许多 REGEX 中仍然没有运气如下:

if (preg_match("/^[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}([/?].*)?$/", 'domain.com?test=test')) {
        echo 'true';
} else {
        echo 'false';
}

在这里我得到错误返回,因此无法使用所需的 GET 参数验证域。

任何帮助将不胜感激^^

问候

【问题讨论】:

  • 您是否有理由要使用正则表达式而不是 filter_varFILTER_VALIDATE_URL
  • 嗨,是的,原因是因为它用于 symfony 路由 yml 文件,需要您使用正则表达式:)
  • 对于域验证正则表达式,请参阅stackoverflow.com/a/16491074/112731

标签: php regex preg-match


【解决方案1】:

此代码未经测试,但我认为它应该可以工作:

$pattern = "([a-z0-9-.]*)\.([a-z]{2,3})"; //Host
$pattern .= "(\?[a-z+&\$_.-][a-z0-9;:@&%=+\/\$_.-]*)?"; //Get requests
if (preg_match($pattern, 'domain.com?test=test')) {
        echo 'true';
} else {
        echo 'false';
}

【讨论】:

    【解决方案2】:

    使用正则表达式有什么好处?

    为什么不直接

    <?php
    $xGETS = count($_GET);
    if(!$xGETS)
    {
        echo 'false';
    } else {
        echo 'true';
    }
    
    // PHP 5.2+ 
    
    $xGETS = filter_var('http://domain.com?test=test', FILTER_VALIDATE_URL, FILTER_FLAG_QUERY_REQUIRED);
    if(!$xGETS)
    {
        echo 'false';
    } else {
        echo 'true';
    }
    

    【讨论】:

      【解决方案3】:

      您的第一个正则表达式将拒绝一些有效的域名(例如来自 museumtravel 的顶级域名和包含大写字母的域名)并会识别一些无效的域名(例如标签或整个域名称太长)。

      如果这对你来说没问题,你不妨搜索第一个问号,把前缀当作域名,把后缀当作“GET参数”(实际上称为查询字符串)。

      如果您不满意,由于域名和标签的长度限制,简单的正则表达式将不足以验证域名。

      【讨论】:

        猜你喜欢
        • 2011-03-02
        • 1970-01-01
        • 2017-11-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-21
        相关资源
        最近更新 更多