Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   PHP (http://www.flasher.ru/forum/forumdisplay.php?f=20)
-   -   Подстановка URL и мыла (http://www.flasher.ru/forum/showthread.php?t=28191)

mmb 07.03.2002 22:17

Подстановка URL и мыла
 
Никак не могу написать регулярное выражение чтобы конструкции типа:
1. http://www.google.com/search?hl=ru&q...%EA+%E2+Google
2. http://www.google.com/search?hl=ru&q...%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. http://www.google.com/search?hl=ru&q...%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 - это тоже ссылка на страничку.


Часовой пояс GMT +4, время: 05:08.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.