2011-06-12 127 views
0

我怎麼能拒絕這樣的:如何用正則表達式去除一部分URL?

http://site.com/index.php?id=15 

進入這個?:

http://site.com/index.php?id= 

其中正則表達式(S)我用?

我一直在努力,現在有一個良好的2小時做到這一點,我有沒有運氣。 我似乎無法拿出末的號碼,有時也有中端 字母以及其給我的問題。

我使用Bing!而不是Google。

我正則表達式到目前爲止,這是當我搜索的東西:

$start = '<h3><a href="'; 
$end = '" onmousedown='; 

while ($result =~ m/$start(.*?)$end/g) 

我能在他們採取了字母和數字在結尾處添加,只是把它作爲一個等號?

謝謝。

+0

只是分裂在「=」並保留第一部分 – 2011-06-12 20:58:21

+0

我將如何做到這一點? split/= /,$ _; < - 那樣? – n0de 2011-06-12 21:38:53

+5

[URI :: QueryParam](http://p3rl.org/URI::QueryParam) – daxim 2011-06-12 23:12:04

回答

3

既然你不能用正則表達式正確解析[X] HTML,你應該尋找可能的最小範圍內,將得到你想要的HREF。

據我所知,一個字不能在一個href是"。因此

/href="([^"]+)"/ 

應該產生一個URL在$1。我會進行健全提取你想要的ID字符串之前檢查它的網址,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

你問一個正則表達式解決方案,但你的問題是有點不明確和HTML正則表達式是隻爲權宜/一次性的東西或否則你可能只是在傷害自己。

因爲我真的不積極的實際需要和HTML源代碼是什麼樣子,這是一個通用的解決方案,以便在拍攝URL和吐出所有的網頁上找到沒有查詢字符串的鏈接。有id=是爲了所有合理的目的/代碼相當於沒有身份證。

很多方式,至少有三個或四個好的解決方案,在Perl中這樣做。這是一個經常被忽視的問題:libxml。 Docs: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, $/; 
} 

這聽起來像也許你正在使用必應!刮。這種事情幾乎與每一個搜索引擎的ToS都是相反的。不要這樣做。如果你註冊並獲得開發令牌,他們就有API(呃,Google至少)。

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 =~ 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 !而不是Google。

您是否試圖解析Bing的輸入!?如果是這樣,請詳細解釋你真正想做的事情。也許我們知道這樣做的更好方法。例如,如果您解析搜索結果的輸出,則可能有一個可以使用的API。

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= 

根據您的需要任何後面的=符號將被忽略從網址