【问题标题】:how do I handle '&' in perl cgi url parameter where the parameter value contains an '&' sign如何处理 perl cgi url 参数中的“&”,其中参数值包含“&”符号
【发布时间】:2017-02-28 00:56:37
【问题描述】:

我正在尝试在 URL 中传递参数并使用 param() 读取参数。 我的一个参数值包含一个“&”符号,因此在通过 param() 读取值时,它会跳过“&”之后的部分。 有什么方法可以在不影响包含 '&' 的值的情况下使用此方法?

例子:

http://someurl/?brand=Bell%20&%20Ross&category=Wrist%20Watch%20Dealers&qq_cat_id=8798798

参数品牌的价值来自“Bell”而不是“Bell & Ross”。

【问题讨论】:

    标签: perl cgi


    【解决方案1】:

    您无需执行任何特殊操作即可处理包含& 的参数值。例如,$cgi->param('brand') 将返回 Bell & Ross

    http://someurl/?brand=Bell%20%26%20Ross&category=Wrist%20Watch%20Dealers&qq_cat_id=8798798
                                 ^^^
    

    问题是 OP 中的 url 构造不正确; brand 参数未设置为 Bell & Ross。以下所有内容都将正确构造url:

    use URI::Escape qw( uri_escape );
    
    my $url = 'http://someurl/';
    $url .= "?" . join('&', 
       join('=', map { uri_escape($_) } brand     => $brand),
       join('=', map { uri_escape($_) } category  => $category),
       join('=', map { uri_escape($_) } qq_cat_id => $qq_cat_id),
    );
    

    use URI qw( );
    
    my $url = URI->new('http://someurl/');
    $url->query_form(
       brand     => $brand,
       category  => $category,
       qq_cat_id => $qq_cat_id,
    );
    

    use URI             qw( );
    use URI::QueryParam qw( );
    
    my $url = URI->new('http://someurl/');
    $url->query_param_append( brand     => $brand );
    $url->query_param_append( category  => $category );
    $url->query_param_append( qq_cat_id => $qq_cat_id );
    

    【讨论】:

    • 第二种方法效果很好。非常感谢 @ikegami 帮助解决这个问题。
    【解决方案2】:

    您的网址并不代表您认为的意思。它并不意味着创建它的人认为它意味着什么。 & 字符在 URL 中具有特殊含义 - 它分隔不同的参数。遇到您的 URL 的任何 URL 解析器都会在该点拆分参数(这就是您得到“Bell”而不是“Bell & Ross”的原因)。

    如果您希望 URL 中的 & 不被视为分隔符,则需要对 & 进行 URL 编码(这会将其转换为 %26)。

    问题不在于处理 URL 的代码。问题在于生成 URL 的代码。这就是需要解决的问题。

    更新:我最初声称该 URL 无效。事实并非如此。)

    【讨论】:

    • 不,OP 的 url 完全有效。
    • 是的,我想你是对的。它是有效的;它只是不代表他们认为的意思。
    猜你喜欢
    • 2013-05-06
    • 2015-03-05
    • 1970-01-01
    • 1970-01-01
    • 2022-11-23
    • 2017-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多