![](/img/trans.png)
[英]How to get http://mysite.com/ indexed in a search engine, not http://mysite.com/index.php, and nothing more?
[英]Using Regex to search for a string that contains “http://” and does not contain “mysite.com”
如何編寫Regular Rxpression來搜索包含“ http://”且不包含“ mysite.com”的字符串?
試圖將正則表達式引入以適當的編程語言最好地完成的布爾邏輯中,這是一件不費力的工作。 盡管可以使用復雜的先行方式編寫/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
}
但是,如果您的目標是拔出所有此類鏈接,那將無濟於事,因為這些前瞻性操作不會告訴您鏈接在字符串中的何處。
在這種情況下,編寫一些東西以拉出鏈接,然后使用兩個單獨的正則表達式過濾掉不想要的情況,要容易得多,而不必嘗試做任何事情。
@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 <tchrist@perl.com>
# 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
以查看總體結果的工作,您需要使用適當的解析器來執行此類操作。
嘗試類似/http:\\/\\/(?!mysite.com)/
樣式,也可以在javascript中工作)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.