Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何对包含撇号的URL使用lynx-dump?_Regex_Perl_Url - Fatal编程技术网

Regex 如何对包含撇号的URL使用lynx-dump?

Regex 如何对包含撇号的URL使用lynx-dump?,regex,perl,url,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 一切都很好,我可以使用正则表达式轻松地推高价格。问题来自URL包含撇号(')或符号(&)时,因为这会导致错误。假设我试图找到游戏Yoshi's Island DS的

我使用lynx-dump从这个网站上获取任天堂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岛-DS”


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

在将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";
...

您需要在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";
...

处理此问题的正确方法是使用
系统
/pipe
打开
(替换qx/backtick运算符)的列表形式避免外壳,请参阅

使用autodie qw(:全部);
打开我的$lynx,'-|',qw(/usr/bin/lynx-dump-width=150),$fullURL;
my@pageFile=;
关闭$lynx;

在极少数不可行的情况下,通过和提供适当的外壳报价。

处理此问题的正确方法是使用
系统的列表形式避免外壳(替换qx/backtick操作符),请参阅

使用autodie qw(:全部);
打开我的$lynx,'-|',qw(/usr/bin/lynx-dump-width=150),$fullURL;
my@pageFile=;
关闭$lynx;

在极少数不实用的情况下,通过和提供适当的shell引用。

你们很多人都想查看并寻找比使用shell调用
lynx
更好的方式来获取网页内容。我一定会记住这一点。我正在为perl课程的最后一个项目制作DS价格检查程序,本学期早些时候我们做了一个作业,使用相同的方法使用lynx转储页面内容。这就是为什么我在这个项目中也保留了相同的方法。我刚刚完成了这一切,它工作得很好,虽然不是很有效,需要一段时间来处理所有的游戏。不过还是要谢谢你的主意!:)你们很多人都希望看到并找到比使用shell调用
lynx
更好的获取网页内容的方法。我一定会记住这一点。我正在为perl课程的最后一个项目制作DS价格检查程序,本学期早些时候我们做了一个作业,使用相同的方法使用lynx转储页面内容。这就是为什么我在这个项目中也保留了相同的方法。我刚刚完成了这一切,它工作得很好,虽然不是很有效,需要一段时间来处理所有的游戏。不过还是要谢谢你的主意!:)
quotemeta
\Q
用于引用正则表达式,而不是shell字符
quotemeta
\Q
用于引用正则表达式,而不是shell字符!出于好奇,为什么使用shell从URL中提取数据如此糟糕?问题一定是,为什么您更喜欢避免使用shell,而不是将参数传递给execve系统调用,而无需进一步解释?更有效的方法是:每次程序启动都保存一个进程。它更安全:您消除了整个类的shell注入错误。它更健壮:像
&
这样的字符不需要特殊处理。只是出于好奇,为什么使用shell从URL中提取信息如此糟糕?问题一定是,为什么您更喜欢避开shell,而不需要进一步解释就将参数传递给execve系统调用?更有效的方法是:每次程序启动都保存一个进程。它更安全:您消除了整个类的shell注入错误。它更健壮:像
'
&
这样的字符不需要特殊处理。