如何将lynx -dump与包含撇号的URL一起使用?

时间:2012-04-24 19:06:18

标签: regex perl url

我使用lynx -dump从本网站提取任天堂DS价格。

例如,假设我要从Yoshi Touch and Go游戏的网页上拉出来:

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

一切正常,我可以使用Regex轻松提价。问题来自于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”。< / p>

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

有人可以帮我找到一个解决方案,将$fullURL字符串变成与URL兼容的字符串吗?

2 个答案:

答案 0 :(得分:3)

在将URL传递给shell之前,您需要转义URL中的'。 Perl提供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";
...

答案 1 :(得分:1)

处理此问题的正确方法是使用system / pipe open的列表形式(替换qx / backtick运算符)来避免shell,请参阅Perl equivalent of PHP's 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引用。