2012-03-14 49 views
0

如何編寫Regular Rxpression來搜索包含「http://」的字符串且不包含「mysite.com」?使用正則表達式搜索包含「http://」且不包含「mysite.com」的字符串

+0

哪種語言? – user123444555621 2012-03-14 13:09:40

+0

沒有語言,我正在使用Adobe Dreamweaver編輯器搜索,它使我能夠使用正則表達式進行搜索。 – Cassini 2012-03-14 13:18:21

+1

試圖將正則表達式轉換爲布爾邏輯最好的方式是用適當的編程語言完成,這是一個不盡人意的工作。雖然可以使用複雜的lookahead編寫「/ PAT1 /而不是/ PAT2 /」,這樣它只是一種模式,但這是一項痛苦的任務。 **你不想這樣做。**使用真正的編輯器如'vi',你可以簡單地進行確認檢查,以便你可以手動干預:':%s/foo/bar/gc'。 – tchrist 2012-03-14 14:24:12

回答

6

警告

試圖拉攏正則表達式到一個適當的編程語言來實現最佳的布爾邏輯是一個吃力不討好的工作。雖然可以使用複雜的lookahead編寫/PAT1/ and not /PAT2/,這樣它只是一個模式,但這是一項痛苦的任務。 你不要這樣做!

你應該首先解釋一下你真的在做什麼 - 在文本編輯器中進行某種匹配操作。你沒有。所以,你會得到一個通用的答案,以適應你的本地化情況。

快速解答

(?sx)     # let dot cross newlines, enable comments & whitspace 
(?= .* http:// ) # lookahead assertion for http:// 
(?! .* mysite\.com) # lookahead negation for mysite.com 

使用Perl語法,你可以堅持的是(預)編譯的模式,以備將來使用一個變量是這樣的:

my $is_valid_rx = qr{ 
    (?= .* http:// ) # lookahead assertion for http:// 
    (?! .* mysite\.com) # lookahead negation for mysite.com 
}sx;      # /s to cross newlines, /x for comments & whitespace 

# then later on… 
if ($some_string =~ $is_valid_rx) { 
    # your string has an http blah and lacks a mysite blah 
} 

但是,如果你的目標是拉出所有這樣的鏈接,這不會幫助你,因爲這些lookaheads不會告訴你鏈接發生在字符串中的什麼位置。

在這種情況下,寫一些東西來拉出鏈接,然後過濾掉不需要的情況,使用兩個單獨的正則表達式,而不是試圖做所有事情,要容易得多。

@all_links = ($some_string =~ m{ https?://\S+ }xg); 
@good_links = grep !/mysite\.com/, @all_links; 

注意,沒有嘗試只匹配包含有效的URL字符,或者說沒有意外的尾隨標點符號正如經常發生在純文本鏈接。

現在,對於一個真正的答案

還要注意的是,如果你與這個解析HTML,上面介紹的方法僅僅是一個快速和骯髒的,快速和寬鬆的,拍,從 - 髖關節類型的鏈接提取。構建有效的輸入很容易產生大量的誤報,而且也不容易構建產生誤報的輸入。

與此相反,這是一個完整的程序,它在URL參數中丟棄了所有的<a ...><img ...>鏈接地址,並且實際上是這樣做的,因爲它使用了真正的解析器。

#!/usr/bin/env perl 
# 
# fetchlinks - fetch all <a> and <img> links from listed URL args 
# Tom Christiansen <[email protected]> 
# Wed Mar 14 08:03:53 MDT 2012 
# 
use strict; 
use warnings; 

use LWP::UserAgent; 
use HTML::LinkExtor; 
use URI::URL; 

die "usage: $0 url ...\n" unless @ARGV; 

for my $arg (@ARGV) { 
    my @links = fetch_wanted_links($arg => qw<a img>); 
    for my $link (@links) { 
     print "$arg => " if @ARGV > 1; 
     print "$link\n"; 
    } 
} 

exit; 

sub fetch_wanted_links { 
    my($url, @wanted) = @_; 

    my %wanted; 
    @wanted{@wanted} = (1) x @wanted; 

    my $agent = LWP::UserAgent->new; 

    # Set up a callback that collect links of the wanted variety 
    my @hits =(); 

    # Make the parser. Unfortunately, we don't know the base yet 
    # (it might be different from $url) 
    my $parser = new HTML::LinkExtor sub { 
     my($tag, %attr) = @_; 
     return if %wanted and not $wanted{$tag}; 
     push @hits, values %attr; 
    }; 

    # Request document and parse it as it arrives 
    my $response = $agent->request(
      HTTP::Request->new(GET => $url), 
      sub { $parser->parse($_[0]) }, 
    ); 

    # Expand all image URLs to absolute ones 
    my $base = $response->base; 
    @hits = map { $_ = url($_, $base)->abs } @hits; 
    return @hits; 
} 

如果你在這樣一個URL運行它,它給這個會計的所有錨和圖像鏈接:

$ perl fetchlinks http://www.perl.org/ 
http://www.perl.org/ 
http://st.pimg.net/perlweb/images/camel_head.v25e738a.png 
http://www.perl.org/ 
http://www.perl.org/learn.html 
http://www.perl.org/docs.html 
http://www.perl.org/cpan.html 
http://www.perl.org/community.html 
http://www.perl.org/contribute.html 
http://www.perl.org/about.html 
http://www.perl.org/get.html 
http://www.perl.org/get.html 
http://www.perl.org/get.html 
http://www.perl.org/about.html 
http://www.perl.org/learn.html 
http://st.pimg.net/perlweb/images/icons/learn.v0e1f83c.png 
http://www.perl.org/learn.html 
http://www.perl.org/community.html 
http://st.pimg.net/perlweb/images/icons/community.v03bf8ce.png 
http://www.perl.org/community.html 
http://www.perl.org/docs.html 
http://st.pimg.net/perlweb/images/icons/docs.v2622a01.png 
http://www.perl.org/docs.html 
http://www.perl.org/contribute.html 
http://st.pimg.net/perlweb/images/icons/cog.v08b9acc.png 
http://www.perl.org/contribute.html 
http://www.perl.org/dev.html 
http://www.perl.org/contribute.html 
http://www.perl.org/cpan.html 
http://st.pimg.net/perlweb/images/icons/cpan.vdc5be93.png 
http://www.perl.org/cpan.html 
http://www.perl.org/events.html 
http://st.pimg.net/perlweb/images/icons/cal.v705acef.png 
http://www.perl.org/events.html 
http://www.perl6.org/ 
http://st.pimg.net/perlweb/images/icons/perl6.v8ff6c63.png 
http://www.perl6.org/ 
http://www.perl.org/dev.html 
http://www.perlfoundation.org/ 
http://st.pimg.net/perlweb/images/icons/onion.vee5cb98.png 
http://www.perlfoundation.org/ 
http://www.cpan.org/ 
http://search.cpan.org/~jtang/Net-Stomp-0.45/ 
http://search.cpan.org/~vaxman/Array-APX-0.3/ 
http://search.cpan.org/~salva/Net-SFTP-Foreign-1.71/ 
http://search.cpan.org/~grandpa/Win32-MSI-HighLevel-1.0008/ 
http://search.cpan.org/~teejay/Catalyst-TraitFor-Component-ConfigPerSite-0.06/ 
http://search.cpan.org/~jwieland/WebService-Embedly-0.04/ 
http://search.cpan.org/~mariab/WWW-TMDB-API0.04/ 
http://search.cpan.org/~teejay/SOAP-Data-Builder-1/ 
http://search.cpan.org/~dylan/WWW-Google-Translate-0.03/ 
http://search.cpan.org/~jtbraun/Parse-RecDescent-1.967_008/ 
http://www.perl.org/get.html 
http://www.perl.org/learn.html 
http://www.perl.org/docs.html 
http://www.perl.org/community.html 
http://www.perl.org/events.html 
http://www.perl.org/siteinfo.html#sponsors 
http://www.yellowbot.com/ 
http://st.pimg.net/perlweb/images/friends/yellowbot.vcc29f5b.gif 
http://www.perl.org/ 
http://blogs.perl.org/ 
http://jobs.perl.org/ 
http://learn.perl.org/ 
http://dev.perl.org/ 
http://creativecommons.org/licenses/by-nc-nd/3.0/us/ 
http://i.creativecommons.org/l/by-nc-nd/3.0/us/80x15.png 
http://www.perl.org/siteinfo.html 

對於任何工作,嚴重超過了一個文件,運行快速grep眼球一般的結果,你需要使用一個合適的解析器來做這種事情。

+1

不要忘了在'mysite.com'中逃避'''。' – Qtax 2012-03-14 13:13:30

+0

我不知道'thisismysite.com'是否必須匹配,但它會是在'mysite'之前可以加一個單詞界限 – Toto 2012-03-14 13:16:46

+0

@Qtax不止如此,事實證明,謝謝 – tchrist 2012-03-14 13:18:17

0

嘗試像/http:\/\/(?!mysite.com)/(perl的作風,工作也是在javascript)

+0

我使用Adobe Dreamwaver編輯器搜索,它使我能夠使用正則表達式進行搜索。 – Cassini 2012-03-14 13:10:32

+1

這將匹配'http:// www.mysite.com' – Toto 2012-03-14 13:13:21

+0

不!請重新閱讀我的問題Iwant「http://」但不是「mysite.com」....用簡單的英語我想獲取所有外部鏈接。 – Cassini 2012-03-14 13:16:09

相關問題