PDA

Просмотр полной версии : Подстановка URL и мыла


mmb
07.03.2002, 22:17
Никак не могу написать регулярное выражение чтобы конструкции типа:
1. http://www.google.com/search?hl=ru&q=%3CA&btnG=%CF%EE%E8%F1%EA+%E2+Google
2. www.google.com/search?hl=ru&q=%3CA&btnG=%CF%EE%E8%F1%EA+%E2+Google
3. google.com/search?hl=ru&q=%3CA&btnG=%CF%EE%E8%F1%EA+%E2+Google
4. gg_g@ggg.ggg-g.ru

заменялись на ссылки в HTML-е. Задачка выглядит просто, но почему-то не решается. Заранее спасибо.

mmb
07.03.2002, 22:21
Как видно этот форум справился с задачкой на три четверти.
Забыл сказать, что ещё ссылка может быть на ftp и начинаться не с пробела, а скажем с перевода коретки или конца строки.
Уверен что бывалые уже сталкивались с такой проблемой.

Fouly
08.03.2002, 12:16
В данном случае форум справился на 100%, т.к. в "google.com/...." нет признаков по которым его нужно считать урлом. По хорошему он и www... не должен был трогать.

Для того, чтоб сделать то что ты хочешь нужно сначала определиться с тем - ЧТО ты считаешь урлом, т.е. какие символы в нем не допустимы и какие являются разделителем.

Если строго придерживать RFC то недопустимые символы, это все кроме тех, что разрешены :)
Но лучше его не придерживаться, т.к. в таком случае многие штучки работать не будут (см. ниже).

Допустим урл это то, что начинается с http:// или www.
Недопустимы все пробельные символы - \s.
$url = "\s";
А в качестве разделителей укажем - "?,()![]
$url_del = "\"\?,()!\[\]";


Для e-mail - наоборот, нужно указывать допустимые.
$eml = "\w-\.";

По поводу FTP
С одной стороны - его нельзя делать вместе с http, так как для него нужно так же как и в случае с e-mail указывать допустимые символы. С другой стороны - никто же не будет писать ftp://domain.com?lalala.
Но тут ещё одна штука, ведь многие пишут фтп не как ftp://domain.com а так ftp.domain.com.
Если ты хочешь заменять ftp. на ftp:// - тогда нужно делать отдельно. Но это ты сам наверное сможешь. По этому сделаем ftp вместе с http.


$str = '
Никак не могу написать регулярное выражение чтобы конструкции типа:
1. http://www.google.com/search?hl=ru&...1%EA+%E2+Google
2. www.google.com/search?hl=ru&q=%3CA&...1%EA+%E2+Google
3. google.com/search?hl=ru&q=%3CA&btnG=%CF%EE%E8%F1%EA+%E2+Google
4. gg_g@ggg.ggg-g.ru

заменялись на ссылки в HTML-е. Задачка выглядит просто, но почему-то не решается. Заранее спасибо.

Дополнительно:
ftp://domain.com
посмотри http://domain.com!
бывает запятая в урле http://domain.com?srarch=1,2,3,4,&aaa=bbb, а бывает после него
бывает вопросительный знак в урле и после него http://domain.com?srarch=1,2,3,4,&aaa=bbb?

редирект http://domain.com?redir=http://flasher.ru/?
а если в самом редиректе есть query http://domain.ru?redir=http://flasher.ru/?q=query?
ещё бывает в скобках:
(http://domain.com)
[http://domain.com]
и даже кавычках
"http://domain.com"
';

$url = "\s";
$url_del = "\"\?,()!\[\]";
$eml = "\w-\.";
$str = preg_replace("/((http:\/\/|ftp:\/\/)[^$url]+)(?<![$url_del])/", '<a href="\\1">\\1</a>', $str);
$str = preg_replace("/(?<!http:\/\/)(www\.[^$url]+)(?<![$url_del])/", '<a href="http://\\1">\\1</a>', $str);
$str = preg_replace("/([$eml]+\@[$eml]+)/", '<a href="mailto:\1">\1</a>', $str);
$str = preg_replace("/\n/", '<br>', $str);
echo $str;


Выше видно - как с этим справился форум.
С твоими прмерами наш регэксп справится так же, а с дополнительными - лучше:)

----
Дополнительно:
ftp://domain.com
посмотри http://domain.com!
бывает запятая в урле http://domain.com?srarch=1,2,3,4,&aaa=bbb, а бывает после него
бывает вопросительный знак в урле и после него http://domain.com?srarch=1,2,3,4,&aaa=bbb?

редирект http://domain.com?redir=http://flasher.ru/?
а если в самом редиректе есть query http://domain.ru?redir=http://flasher.ru/?q=query?
ещё бывает в скобках:
(http://domain.com)
[http://domain.com]
и даже кавычках
"http://domain.com"
-------

mmb
11.03.2002, 16:59
Но ведь google.com - это тоже ссылка на страничку.