我该怎么做呢:
http://site.com/index.php?id=15
进入这个?:
http://site.com/index.php?id=
我使用哪种RegEx?
我一直试着做了2个小时,我没有运气。 我似乎无法在最后取出数字,有时也有 最后的字母也给我带来了问题。
我正在使用Bing!而不是谷歌。
到目前为止,当我搜索某些内容时,我的RegEx是这样的:
$start = '<h3><a href="';
$end = '" onmousedown=';
while ($result =~ m/$start(.*?)$end/g)
我可以添加什么来取出最后的字母和数字,并将其保留为等号?
谢谢。
答案 0 :(得分:3)
由于您无法使用正则表达式正确解析[X] HTML,因此您应该寻找可以获得所需href的最小可能上下文。
据我所知,href中不能包含的一个字符是"
。因此
/href="([^"]+)"/
应在$1
中生成一个网址。在提取你想要的id字符串之前,我会仔细检查它的URL-ishness,然后:
s/\?id=\w+/id=/
但是这已经写了整篇文章because you can't parse HTML with regular expressions。因此,它可能会在您第一次向客户展示时中断。
你应该检查一下正确的Perl解析:http://www.google.com/webhp?q=perl+html+parser
答案 1 :(得分:1)
你问了一个正则表达式解决方案,但是你的问题有点不明确,HTML的正则表达式只适用于止损/一次性的东西,否则你可能只是在伤害自己。
由于我真的不肯定你的实际需求和HTML源代码是什么,这是一个通用的解决方案,用于获取URL并吐出页面上没有查询字符串的所有链接。 id=
用于所有合理目的/代码等同于无id。
在Perl中有许多方法,其中至少有三个或四个是很好的解决方案。这是一个经常被忽视的问题:libxml。文档:XML::LibXML,URI和URI::QueryParam(如果您想要更好的查询操作)。
use warnings;
use strict;
use URI;
use XML::LibXML;
my $source = shift || die "Give a URL!\n";
my $parser = XML::LibXML->new;
$parser->recover(1);
my $doc = $parser->load_html( location => $source );
for my $anchor ( $doc->findnodes('//a[@href]') )
{
my $uri = URI->new_abs( $anchor->getAttribute("href"), $source );
# commented out ideas.
# next unless $uri->host eq "TARGET HOST NAME";
# next unless $uri->path eq "TARGET PATH";
# Clear the query completely; id= might as well be nothing.
$uri->query(undef);
print $uri, $/;
}
听起来好像你正在使用Bing!用于刮擦。这种事情几乎与每个搜索引擎的ToS相悖。不要这样做。如果你注册并获得一个开发令牌,他们就有API(好吧,Google至少会这样做)。
答案 2 :(得分:0)
我不是100%肯定你在做什么,但这就是问题所在:
while ($result =~ m/$start(.*?)$end/g)
这个循环的目的是什么?你正在使用一个名为$result
的标量并检查模式匹配。 $result
如何变化?
您最初的问题是如何做到这一点:
http://site.com/index.php?id=15
进入这个:
http://site.com/index.php?id=
也就是说,如何从表达式中删除15
(或其他数字)。答案很简单:
$url =~ s/=\d+$/=/;
这将把你的正则表达式锚定在URL的末尾,用什么都不替换结束数字。
如果你要删除任何字符串,它会更复杂一些:
$url =~ s/=[^=]+/=/;
你不能简单地使用\S+
,因为正则表达式通常是贪婪的。因此,您需要指定任何一系列前面带有等号的非等号符号。
现在,对于while
循环,也许你想要一个if语句......
if ($result =~ /$start(.*?)$end/g) {
print "Doing something if this matched\n";
}
else {
print "Doing something if there's no match\n";
}
而且,我不确定这意味着什么:
我正在使用Bing!而不是谷歌。
您是否正在尝试解析Bing的输入!?如果是这样,请准确解释您的确想要做什么。也许我们知道更好的方法。例如,如果您正在解析搜索结果的输出,则可能存在可以使用的API。
答案 3 :(得分:0)
我该怎么做呢:
http://site.com/index.php?id=15
进入这个?:
http://site.com/index.php?id=
我认为这是您正在寻找的解决方案
#!/usr/bin/perl
use strict;
use warnings;
my $url="http://site/index.php?id=15";
$url =~ s/(?<=id=).*//g;
print $url;
输出:
http://site.com/index.php?id=
根据您的需要,从URL
中省略=符号后的任何内容