0

我正在使用 lynx -dump 从这个网站上提取 Nintendo DS 的价格。

例如,假设我要从游戏 Yoshi Touch and Go 的网页中提取:

/usr/bin/lynx -dump -width=150 http://videogames.pricecharting.com/game/nintendo-ds/Yoshi-Touch-and-Go

一切正常,我可以使用正则表达式轻松拉出价格。当 URL 包含撇号 (') 或与号 (&) 时会出现问题,因为这会引发错误。所以假设我尝试找到游戏 Yoshi's Island DS 的页面,我会使用这行代码:

/usr/bin/lynx -dump -width=150 http://videogames.pricecharting.com/game/nintendo-ds/Yoshi's-Island-DS

这会给我这些小错误:

sh: -c: line 0: unexpected EOF while looking for matching `''
sh: -c: line 1: syntax error: unexpected end of file

这是我用来调用 -dump 的代码,$fullURL其中包含以下字符串:“http://videogames.pricecharting.com/game/nintendo-ds/Yoshi's-Island-DS”。

$command     = "/usr/bin/lynx -dump -width=150 $fullURL";
@pageFile = `$command`;

谁能帮我找到将$fullURL字符串转换为 URL 兼容字符串的解决方案?

4

2 回答 2

3

'在将 URL 传递给 shell 之前,您需要对其进行转义。Perl 提供了 to quotemeta 函数来执行大多数 shell 所需的转义。

my $quoted_URL = quotemeta($fullURL);
$command     = "/usr/bin/lynx -dump -width=150 $quoted_URL";
...

您还可以在字符串中使用\Q和转义符来获得相同的结果。\E

$command     = "/usr/bin/lynx -dump -width=150 \Q$fullURL\E";
...
于 2012-04-24T19:27:58.647 回答
1

处理此问题的正确方法是使用system/pipe的列表形式open(替换 qx/backtick 运算符)来避免 shell,请参阅Perl 等效于 PHP 的 escapeshellarg

use autodie qw(:all);
open my $lynx, '-|', qw(/usr/bin/lynx -dump -width=150), $fullURL;
my @pageFile = <$lynx>;
close $lynx;

在不实用的极少数情况下,通过String::ShellQuoteWin32::ShellQuote提供正确的 shell 引用。

于 2012-04-24T21:52:09.797 回答