1

これをperlの正規表現で機能させようとしていますが、理解できないようです。「。website」を含むURLを取得したいと思います。このようなものを除いて(「.website」の前に「en」が付いている)。

   $linkhtml =  'http://en.search.website.com/?q=beach&' ;

これは、正規表現によって返されるURLの例ですが、上記のURLは拒否されます

   $linkhtml =  ' http://exsample.website.com/?q=beach&' ;

これが私の試みです..私が間違っていることについてのアドバイスはありがたいです

   $re2='(?<!en)'; # Any number of characters
   $re4='(.*)'; # Any number of characters
   $re6='(\.)'; # Any Single Character 4
   $re7='(website)'; # Word 2
   $re8='(\.)'; # Any Single Character 5
   $re9='(.*)'; # Any number of characters

   $re=$re4.$re2.$re6.$re7.$re8.$re9;

   if ($linkhtml =~ /$re/)
4

3 に答える 3

1

私は2つのステップでそれを行います:最初に一般的な正規表現を使用してURL(またはURLのように見えるもの)をチェックします。en次に、それと一致する各結果を、前にホストで発生することを探す別の正規表現と照合し、一致するwordpressものをすべて破棄します。

于 2010-07-16T19:59:05.223 に答える
1

アサーションの後に一致させようとしているコンテンツが非常に一般的であるため、アサーション自体と一致する場合、ネガティブルックビハインドアサーションはうまく機能しません。検討:

perl -wle'print "en.website" =~ qr/(?<!en\.)web/'        # doesn't match
perl -wle'print "en.website" =~ qr/(?<!en\.)[a-z]/'      # does match, because [a-z] is matching the 'en'

ここで行う最善のことは、Davidが提案したことです。2つのパターンを使用して、良い値と悪い値を選別します。

my @matches = grep {
     /$pattern1/ and not /$pattern2/
} @strings;

...ここで、pattern1はすべてのURLに一致し、pattern2は「en」URLのみに一致します。

于 2010-07-16T20:34:47.610 に答える
0

これが最終的な解決策です。将来、正規表現に不慣れで同様の問題が発生した場合に備えて、これをラップしました。私の場合、これは「forループ」であるため、配列を通過します。しかし、それは必要性次第です。

まず、「en」が含まれているURLを除外します。これらは、必要なURLではないためです。

        $re1='(.*)';    # Any number of characters
        $re2='(en)';    # Word 1
        $re3='(.*)'; # Any number of characters


        $re=$re1.$re2.$re3;
        if ($linkhtml =~ /$re/)
        {


    #do nothing, as we don't want a link with "en" in it

        }

        else {

        ### find urls with ".website."
        $re1='(.*)';    # Any number of characters
        $re2='(\.)';    # period
        $re3='(website)';   # Word 1
        $re4='(\.)';    # period
        $re5='(.*)'; # Any number of characters


        $re=$re1.$re2.$re3.$re4.$re5;

            if ($linkhtml =~ /$re/) {

            #match to see if it is a link that has ".website." in it


            ## do something with the data as it matches, such as:
                       print "linkhtml

            }

           }
于 2010-07-16T21:12:12.210 に答える