如何使用正则表达式删除URL的一部分?

时间:2011-06-12 20:53:28

标签: regex perl

我该怎么做呢:

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)

我可以添加什么来取出最后的字母和数字,并将其保留为等号?

谢谢。

4 个答案:

答案 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::LibXMLURIURI::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

中省略=符号后的任何内容