如何处理 Perl CGI URL 参数中的"&",其中参数值包含"&"符号



我正在尝试通过url中的参数并使用param()读取参数。我的参数值之一包含一个'&'签名,因此,在通过param()读取值时,它会跳过'&'之后的零件。有什么办法可以使用此方法,而不会损害包含'&'?

的值

示例:

http://http://someUrl/?brand = bell%20&%20ROSS& category = Warist%20watch%20Dealers& qq_cat_id = 8798798

参数品牌的价值即将到来,而不是"贝尔& ross"。

您不必做任何特别的事情来处理包含 &的param值。例如,$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 );

您的URL并不意味着您认为它的含义。这并不意味着创造它的人认为它的含义。&字符在URL中具有特殊的含义 - 它分开了不同的参数。任何遇到URL的URL解析器都会在此时拆分参数(这就是为什么您要获得"钟声"而不是" Bell& Ross")。

如果您在URL中想要一个不视为分离器的&,则需要URL对&进行编码(将其转换为%26)。

问题不在处理URL的代码上。问题在于生成URL的代码。这就是需要修复的。

更新:我最初声称URL无效。这不是真的。)

最新更新