Как я могу переписать URL-адреса, кроме адресов определенного домена? - PullRequest
1 голос
/ 27 января 2010

Не могли бы вы помочь мне сделать регулярное выражение Perl, чтобы заменить ( http: //.+) до http://www.my1.com/redir?$1 но ничего не делайте для URL, таких как http://www.my1.com/ или http://my1.com/

Например, мне нужно заменить http://whole.url.site.com/foo.htm до http://www.my1.com/redir?http://whole.url.site.com/foo.htm http://www.google.com до http://www.my1.com/redir?http://www.google.com но оставьте http://www.my1.com/index.php не привязанным.

Большое спасибо!

Ответы [ 5 ]

7 голосов
/ 27 января 2010

Если вы делаете это внутри скрипта Perl, не используйте регулярные выражения. В данном случае читать их бесполезно, и до сих пор каждый ответ на регулярное выражение не работает, поскольку он не экранирует URI, который вы хотите поместить в строку запроса.

Вместо того, чтобы пытаться анализировать URI самостоятельно, пусть проверенный временем модуль URI обработает все крайние случаи для вас. Модуль URI :: Escape помогает вам создать строку запроса, чтобы вы не зарезали лишние символы в URL:

#!perl

use URI;
use URI::Escape;

while( <DATA> )
    {
    chomp;

    my $url = URI->new( $_ );

    if( $url->host =~ /(^|\.)my1\.com$/ ) {
        print "$url\n";
        }
    else {
        my $query_string = uri_escape($url->as_string);
        print "http://www.my1.com/redir?$query_string\n";
        }
    }

__DATA__
http://whole.url.site.com/foo.htm
http://www.google.com
http://www.google.com/search?q=perl+uri
http://www.my1.com/index.php
http://my1.com/index.php
http://moremy1.com/index.php
2 голосов
/ 27 января 2010
s{http://www\.nop1\.com/}{http://www.my1.com/redir?http://www.nop1.com}g

Соответствует вашим требованиям, как указано.

Если ваши требования немного отличаются, вам нужно объяснить, что именно вы хотите.

Кроме того, я не уверен, что это имеет отношение к негативному прогнозу.

РЕДАКТИРОВАТЬ: С переформулированным вопросом, здесь мы идем:

s{^http://(?!(?:www\.)?my1\.com)(.+)}{http://www.my1.com/redir?$1}g

(немного подправил)

1 голос
/ 27 января 2010

Возможно, вы захотите захватить имя сайта URL, если так, попробуйте это:

 s{http://www\.(.*?)\.com/}{http://www.my1.com/redir?http://www.$1.com}g
0 голосов
/ 27 января 2010
s|(http://www\.(?!my1\.)(.*)\.com)|http://www.my1.com/redir?$1|i;

Это соответствует любому веб-сайту www. *. Com, который не является www.my1.com, и помещает его в редирект.

0 голосов
/ 27 января 2010

Это, вероятно, не очень хорошая идея, но это можно сделать:

$foo='http://www.foo.com/';
$foo =~ s#^(http://(?!(?:www\.)?my1\.com/).+)$#http://www.my1.com/redir?$1#;
print $foo;

Результат:

http://www.my1.com/redir?http://www.foo.com/

Как отмечает Брайан в комментарии, он не будет работать с URL-адресами, которые не заканчиваются на '/'. Я не уверен, хотите ли вы переписать этот URL или нет. Как я уже сказал в своем комментарии к вашему вопросу, вам действительно нужно быть более точным в том, что вы пытаетесь сделать и почему вам нужно использовать регулярные выражения для этой задачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...