Автор Тема: ereg_replace - точное выделение адреса сложного адреса  (Прочитано 3227 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн tarya

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 370
  • +0/-0
  • 0
    • Просмотр профиля
Задумался на тем чтоб сделать выделение адреса автоматически как тут на форуме:

Почитал по выражениям немного написал:


$body ereg_replace ("http://(([A-Za-z0-9./?\\-])*)""<a href =\\"\\\\0\\" target=\\"_blank\\">\\\\0</a>"$body);



все работает, но потом оказалось что когда приходится обработать более длинную стоку типа http://www.yandex.ru/yandsearch?rpt=rad&text=php то получается совсем плохо, не может.


Подскажите регулярное выражение для полного соответствия чтоб  любую стоку адреса обработало.

Спасибо большое
Рожденный с понимающим, и гордо поднятым кулаком! Свидетель разреза запястья — он с ним!

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
идеального паттерна не может быть по определению.
допустим, запятая может быть как просто запятой, так и частью адреса.
и так со многим символами.
так что, пиши просто http://(\\S*)"  - все от хттп до пробела - и будет тебе щастье.

Оффлайн Макс

  • vir magni ingenii
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3534
  • +0/-0
  • 2
    • Просмотр профиля
хмм... вообще-то URL-ы каким-то RFC описываются и набор символов ограничен и запятая не может быть частью адреса (echo urlencode(",");)  Это современные броузеры начали "умничать" и "правильно" обрабатывать http://a.ru?a=русский,текст
На php.spb.ru был регексп подсветки адресов или из какого-то бесплатного форума вытяни (типа phpBB)
First learn computer science and all the theory. Next develop a programming style. Then forget all that and just hack. ( George Carrette )

Оффлайн Макс

  • vir magni ingenii
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3534
  • +0/-0
  • 2
    • Просмотр профиля
Цитировать
http://a.ru?a=русский,текст

[off]мда, VBulletin даже неправильные ссылки "правильно" отрабатывает ;) [/off]
First learn computer science and all the theory. Next develop a programming style. Then forget all that and just hack. ( George Carrette )

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
дело не в русском тексте, а в очень распространенных ссылках на флеш ролики, уж не знаю, что там на сервере стоит.
вила ?0,0,32456,0

и дело не в том, что современные браузеры такие умные, а в объективной реальности

Оффлайн mikelsv

  • Завсегдатай
  • Новичок
  • *
  • Сообщений: 40
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.MikelSV.com
Нашел интересный код. Попробуй:

$text = ereg_replace("[[:alpha:]]+://[^<>[:space:]]+[[:alnum:]/]",
                     "\\\\0", $text);
Обязательно напиши, что получилось.

Оффлайн tarya

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 370
  • +0/-0
  • 0
    • Просмотр профиля
Цитировать
mikelsv:
Нашел интересный код. Попробуй:[/quote


да мне бы по ссылке адресов, но я кажется разобрался в чем беда была :)
Рожденный с понимающим, и гордо поднятым кулаком! Свидетель разреза запястья — он с ним!

Оффлайн Zpt

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 8
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Вообще вроде всего 3 варианта где может быть использована ссылка:
src=
href=
background=

поэтому лучше всего искать от начала, потом смотреть следующий символ после равно, и на такой символ должна заканчиваться ссылка, если не стоит символ отмены, тогда продолжать поиск. Еще худший вариант, если после = стоит не ковычка (однерная, двойная), а символ, значит заканчивается ссылка или на пробел или на символ завершающего тэга, а еще может стоять пробел внутри кавычек допустим как параметр для какой-то функции.

Вобщем нормальный сценарий для 100% выделения ссылок можно написать, но он будет медленно работать, чем-то всегда приходится жертвовать... :(

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28