【问题标题】:URL with query string validation using PHP使用 PHP 进行查询字符串验证的 URL
【发布时间】:2011-12-14 13:15:30
【问题描述】:

我需要一个带有查询字符串(用 & 分隔的参数)的 URL 验证函数。目前我有以下用于验证 URL 的函数

$pattern = '/^(([\w]+:)?\/\/)?(([\d\w]|%[a-fA-f\d]{2,2})+(:([\d\w]|%[a-fA-f\d]{2,2})+)?@)?([\d\w][-\d\w]{0,253}[\d\w]\.)+[\w]{2,4}(:[\d]+)?(\/([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)*(\?(&?([-+_~.\d\w]|%[a-fA-f\d]{2,2})=?)*)?(#([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)?$/';

echo preg_match($pattern, $url);

这个函数正确地验证输入

google.com www.google.com http://google.com http://www.google.com ...等

但是当它带有参数(查询字符串)时,这不会验证 URL。例如。

http://google.com/index.html?prod=gmail&act=inbox

我需要一个接受这两种类型的 URL 输入的函数。请帮忙。提前致谢。

【问题讨论】:

    标签: php url query-string url-validation


    【解决方案1】:

    一个简单的filter_var

    if(filter_var($yoururl, FILTER_VALIDATE_URL))
    {
      echo 'Ok';
    }
    

    可能会成功,尽管 url 没有在架构之前存在问题: http://codepad.org/1HAdufMG

    您可以通过在不带 http:// 的网址前面放置 http:// 来解决此问题。
    正如@DaveRandom 所建议的,您可以执行以下操作:

    $parsed = parse_url($url); 
    if (!isset($parsed['scheme'])) $url = "http://$url";
    

    在输入 filter_var() 函数之前。

    不过,总的来说,它仍然是一个比一些额外复杂的正则表达式更简单的解决方案..

    它也有这些标志可用:

    FILTER_FLAG_PATH_REQUIRED FILTER_VALIDATE_URL 需要 URL 包含路径部分。 FILTER_FLAG_QUERY_REQUIRED FILTER_VALIDATE_URL 要求 URL 包含查询字符串。

    【讨论】:

    • FTR,我认为确保该方案存在的最明智的方法是$parsed = parse_url($str); if (!isset($parsed['scheme'])) $url = "http://$url";
    • 我使用 Parse_url 检查 URI 中是否存在查询。几乎工作..:)
    【解决方案2】:

    http://php.net/manual/en/function.parse-url.php

    有些人可能认为这不是 100% 防弹的,
    但是你可以尝试一下作为开始

    【讨论】:

    • 虽然This function is not meant to validate the given URL, it only breaks it up into the above listed parts.
    • @DamienPirsy 确实,我正准备回答这个问题,直到我开始使用它并发现我实际上无法想出任何可以让它返回 false 的东西。即使通过"\x00""this@is.not.a.url" 也不会破坏它...
    猜你喜欢
    • 1970-01-01
    • 2014-07-20
    • 1970-01-01
    • 2019-02-19
    • 2019-10-29
    • 1970-01-01
    • 2020-11-21
    • 2018-05-09
    • 1970-01-01
    相关资源
    最近更新 更多