IMHO.WS

IMHO.WS (https://www.imho.ws/index.php)
-   Веб-программирование (https://www.imho.ws/forumdisplay.php?f=29)
-   -   Регулярные выражения в Perl - распознавание URL (https://www.imho.ws/showthread.php?t=75768)

nemur 15.12.2004 00:37

Регулярные выражения в Perl - распознавание URL
 
На форуме нужно добавить автоматическое распознавание URL (с преобразованием в ссылку). Как это сделать, если можно, с рабочим примером :rolleyes:

RaZEr 15.12.2004 00:54

Рега получиться вроде /(\w+\:\/\/|www\.)[\w\-\.\:\@\#\%\/\[\]]+/
Как юзать прочти в мане.

nemur 15.12.2004 01:11

Этот regexp, если я правильно понял, не распознает ссылку в конце предложения (точку к ней приделает) и ссылки на скрипты вроде http://imho.ws/showthread.php?p=720420#post720420. Как подправить? :(

Хм. Кстати, неплохая идея взять исходники этого vBulletin, кажется, он правильно это делает :) Кто-нибудь может глянуть?

Hubbitus 15.12.2004 01:45

Цитата:

nemur:
Этот regexp, если я правильно понял, не распознает ссылку в конце предложения (точку к ней приделает) и ссылки на скрипты вроде http://imho.ws/showthread.php?p=720420#post720420. Как подправить?
Вы предлагаете в регулярном выражении анализировать синтаксис русского (английского, другого) языка, чтобы найти конец предложения? А как тогда с безграмотностью быть?
Ведь если точка действительно в адресе и написана в нем, то будет ошибкой ее отрезать.

Ну а если это нужно все-таки, то помоему проще/быстрее ее отрезать средствами PHP (ну или любого другого языка)

nemur 15.12.2004 01:56

Цитата:

Hubbitus:
Вы предлагаете в регулярном выражении анализировать синтаксис русского (английского, другого) языка, чтобы найти конец предложения?
Нет, зачем же... Просто, скажем, если за точкой пробел, то это конец предложения, и точка не входит в ссылку. Опять-таки, vBulletin справляется (см. ссылки в предыдущих постах).

Hubbitus 15.12.2004 14:05

Цитата:

nemur:
Просто, скажем, если за точкой пробел, то это конец предложения, и точка не входит в ссылку.
Это лишь наиболее вероятно, но не всегда правильно...
Вобщем, чего спорить-то, если Вам нужно сами решайте, отрезать точку по Вашему принципу не сложно ведь, например так:
/((?:\w+\:\/\/|www\.)[\w\-\:\@\#\%\/\[\]\?\=\&\.]+?)(?:\.\s|\s)/
Ну или краткая форма (помоему в ссылке почти все может быть при желании):
/((?:\w+\:\/\/|www\.)[^\s]+?)(?:\.\s|\s)/

nemur 15.12.2004 23:54

Сделал вот так:

$pattern = qr/\-\w\~\\\/\:\@\#\$\%\[\]\?\!\=\&\./;
$message =~ s/((?:http:\/\/|www\.)[$pattern]+?)([\.\,\!\?]*[^$pattern]|\Z)/<a href=\"$1\">$1<\/a>$2/g;

предполагалось, что ссылка должна прерваться любым символом, не входящим в $pattern или концом строки, причем если перед ним стоит N точек, запятых, ! и ?, то они не включаются в ссылку.

однако, у конструкции (http://some.domain.com/test). в ссылку включается также закрывающая скобка ')' :confused: Других ошибок пока не было замечено. Что неправильно, объясните?

Добавлено:
теперь исправил на
/((?:(?:https?|ftp):\/\/|www\.)[$pattern]+?)([\.\,\!\?\)]*(?:[^$pattern]|\Z))/
Со скобкой больше проблем нет, но зачем ее необходимо включать??? :(
И еще, посоветуйте, кто знает хорошую книжку по регекспам :)

RaZEr 16.12.2004 12:52

Цитата:

И еще, посоветуйте, кто знает хорошую книжку по регекспам
Начни с мануала :contract:

Hubbitus 16.12.2004 14:34

Цитата:

nemur:
И еще, посоветуйте, кто знает хорошую книжку по регекспам
http://php.spb.ru/regular_expression.html Здесь советуют хорошую бумажную книгу (может где-то есть и электронная), а также статьи по регам.

http://www.softtime.ru/dic/id_dic=134&id_group= А тут вообще-то для PHP, но очень грамотно описаны какраз отличия от PERL, поэтому можено читать и для того и для другого языка. Рекомендую.

nemur 16.12.2004 22:14

RaZEr, Hubbitus:
Спасибо. Буду изучать :)


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

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.