Эта тема на forum.dklab.ru


Юрий Насретдинов: Автоматическая подсветка URL
САБЖ. Честно говоря, хотелось бы по прошествии перенести эту тему в форум "готовые решения"...

Нужно: автоматическая подсветка URL (переделывание в ссылку), с учетом того, что внутри BB- и HTML-тегов нельзя еще раз обрабатывать эти адреса (типа или <a href="www.dklab.ru"> не должны еще раз заменяться.), + к тому, система должна уметь обрабатывать адреса без http:// и www, например просто dklab.ru тоже должно подсвечиваться, и хорошо работать со знаками препинания (хотя я бы всем рекомендовал отделять ссылки пробелами в любом случае).

Вот что у меня получилось (и в принципе, работает), это регулярное выражение:


"/([ \n => \!\?\"'\)\(])(http\:\/\/)?(([a-z0-9_-]+\.)+)(com|net|org|mil|edu|arpa|gov|biz|info|aero|inc|name|uk|ru|us|museum|ws|su|nu|jp|ua)([^\]]*)([ \n => \!\?\"'\)\(])/isU" => "\\1<a href=\"http://\\3\\5\\6\" target=_blank>\\2\\3\\5\\6</a>",


Я его очень много раз дополнял, переделывал, многое из этого я сделал, но видимо мне не хватает знаний и опыта по регулярным выражениям... Я посмотрел даже, как сделано это в phpBB, но оно не соответствует многим пунктам...

В общем, я рассчитываю на вашу помощь :). Заранее спасибо.
Дмитрий Эсс:
А как же 243 домена ccTLD? ИМХО не стоит перечислять все домены первого уровня.
7.3.:
например просто dklab.ru тоже должно подсвечиваться
Единственный минус. Если убрать проверку зоны(com,net,ru), то будет подсвечивать все строки и точкой на инглише. Но указывать домены первого уровня, имхо, уже лишнее.
Юрий Насретдинов:
не стоит перечислять все домены первого уровня
будет подсвечивать все строки и точкой на инглише
Я думал о таком варианте, но все же решил отказаться... Что будет если человек забудет поставить пробел после точки и конца предложениями ?

This is the demonstration how it works.You see,...

И такое будет встречаться очень часто. В таком случае можно понять разработчиков phpBB, которые побоялись так делать. Но ведь можно решить проблему: указать достаточное количество распространенных доменов, а остальной 1 % может пользоваться тегом ...

Мне же хотелось, чтобы вы помогли решить проблемы со знаками препинания - у меня получается, что если URL находится после перевода строки, либо в самом начале сообщения, то такой URL не подсвечивается. Он также "захватывает" последний символ, который посчитал "знаком препинания", например конец строки магическим образом попадает в href ссылки...
7.3.:
Помойму можно знаки, по-любому не входящие в url, писать сразу после ссылки, например:
$text=ereg_replace("(h?[tf]tp://[-~a-zA-Z_0-9/.+;%&?|=:]+)([^-~a-zA-Z_0-9/.+%&?|=:]|$)",'<a href="\\1" target="_blank">\\1</a>\\2', $text);// содержимое второго кармана пишем после ссылки
Юрий Насретдинов:
manfred:
Не надо пожалуйста цитат из своего форума... Почитайте несколько пунктов (например про то, что адрес может быть без http:// и даже www) из моего первого постинга... Если бы задача была сделать "обычную" подсветку, я бы не мучался...
7.3.:
yUAC:
Это уже не из моего форума, так как я убрал автоматическую подсветку. Просто я привел пример, если на конце адреса стоит точка, как его правильно обрабатывать. Насколько я понял, у Вас возникла такая проблема, что юзер может случайно не поставить пробел между предложениями на инглише и тогда оно подсветится, но это только если Вы хотите подсвечивать даже без www и без указания домена первого уровня, то есть <a href=\"http://\\3\\5\\6\" target=_blank>\\2\\3\\5\\6</a>(а тут писать символы, которые не входят в url, но идут без пробела).
Дмитрий Эсс:
This is the demonstration how it works.You see,...
I see it, it works.Name 3 planets please.

Может сделать учёт регистра? Т.е., если домен первого уровня начинается с заглавной буквы, а все остальные буквы в нём маленькие (например, Name или Net), то отбраковывать ссылку.
Юрий Насретдинов:
Дмитрий Эсс:
В общем, надо сделать, рег, который:

1) работает и в начале и в конце предложения
2) работает нормально в "кавычках", перед вопросом?, восклицательным знаком!, запятой (точку можно не обрабатывать в принципе), (со скобками)
3) подчеркивает ссылки без www и http:// (например dklab.ru/chicken/web/)
4) работает с https и ftp
5) учитывает все возможные символы, которые могут быть использованы в URL (скажем #)

Мой рег похоже никуда не годится...
7.3.:
yUAC:
А почему бы не воспользоваться функцией, в параметры которой передавалось бы содержимое карманов? Так же проще. Жалко я не знаю как это делается(только видел пример), потому что только в перловых регах помойму такое можно делать... а я только регэкспы знаю.
DmitriyPopov:
yUAC:
Не пытайся убить всех зайцев.
Хочешь подсветку dklab.ru - делай.
Но будь готов к тому что очень большое количество ссылок не будут подсвечиваться даже с указанием Http. А это, извиняюсь, уже нонсенс.

Если попробуешь сказать, что доменов таких в России встречается очень мало - сходу привожу пример, которого у тебя нет:
.tk
Домен полубесплатный. И встречается в Российских ссылках очень часто.

Не искушай судьбу, а то я резко вспомню очень у нас популярный .by .

А если и этого мало - .am

Дальше продолжать? На самом деле доменов много, которые у нас встречаются. И сделав проверку домена, ради тех ссылок, где не указан www. или HttP, ты убьешь возможность впринципе поставить ссылку на нормальные полноценные пути с указанием http:, но находящиеся в другом домене...


Я бы на твоем месте, все таки забил бы на dklab.ru, и сделал бы хотя бы www.dklab.ru минимум.
Юрий Насретдинов:
Дмитрий Попов:
Можно сделать два рега - первый ты видишь наверху, а второй будет перехватывать остальные, написанные скажем с www. или даже с http://, как ты думаешь ?
DmitriyPopov:
yUAC:
Пища для размышлений:

Hellow! I want be clever.Info about me you can get here.

И второе, что бы не придирался к английскому:

Moget genit'sa.Net ne hochu! bezuslovno bivaut i umnie ludi.Nu i ya takoi je.

Я бы, все-таки, вообще отказался от подсветки таки адресов :)
Юрий Насретдинов:
Дмитрий Попов:
Хм. Ну такое бывает крайне редко. Я же хотел сделать более "умную" систему, которая без www и http подсвечивила адреса, т.к. "обычных" пруд пруди, можно из того же PhpBB выдрать.
DmitriyPopov:
yUAC:
Кстати, если ты решишь делать двумя выражениями подсветку - то тогда ты вообще запаришся со вторым... Хотя, может и нет...
Юрий Насретдинов:
Хотя, может и нет...
Вот именно, что можно пропускать вещи типа =" перед адресом, и все.
DmitriyPopov:
yUAC:
А Если:
Для этого напишите &gt;a href="http://www.porno.bz" &lt;
Юрий Насретдинов:
Дмитрий Попов:
В таком случае можно <a href=" пропускать. Тогда 100 % гарантия будет :)

Эта тема на forum.dklab.ru