LINUX.ORG.RU

Скобки в ссылках


0

0

Не знаю, поднимался уже этот вопрос или нет, но все знают, что на ЛОРе немного туповатое автоопределение ссылок - оно не включает скобку в конце, если она должна входить в ссылку. Логика тут простая: в большинстве случаев, если есть открывающая скобка [(], то должна быть и закрывающая [)]. То есть алгоритм очевиден: если в последней части ссылки есть "(", то ")", если таковая имеется, должна входить в автоурл. Ма-акс, сдела-ай?

PS. Проверка:

http://ru.wikipedia.org/wiki/Скобки_(значения)

(http://ru.wikipedia.org/wiki/Скобки_(значения))

http://ru.wikipedia.org/wiki/Скобки_(знач)ения)

★★★★★

логика проще - начинается слово с http:// значит сслыка до следующего пробела.

wfrr ★★☆
()
Ответ на: комментарий от wfrr

> логика проще - начинается слово с http:// значит сслыка до следующего пробела.

Нифига. Пример: "Добавлена поддержка something (http://something.com) и божественного сглаживания шрифтов". С твоей логикой, ссылка была бы попорчена.

Obey-Kun ★★★★★
() автор топика
Ответ на: комментарий от Obey-Kun

С моей логикой нужно отбивать пробелами, и не страдать фигней, все равно на любой самый умный парсер найдется тупой юзер который запорет ссылку, зачем тогда усложнять.

wfrr ★★☆
()
Ответ на: комментарий от wfrr

большинству, ИМХО, ближе то, что я говорю. Или я ошибаюсь? Можно подождать мнения большинства:)

Obey-Kun ★★★★★
() автор топика
Ответ на: комментарий от Obey-Kun

Щас явится тот чье имя не поминают в суе и накидает нам плюсиков, а слушать мнение большинства - глупо.

wfrr ★★☆
()
Ответ на: комментарий от wfrr

Ну тогда ждём Слова Макскомова.

Obey-Kun ★★★★★
() автор топика

urlRE = new RE("(?:(?:(?:(?:https?://)|(?:ftp://)|(?:www\\.))|(?:ftp\\.))[a-z0-9.-]+\\.[a-z ]+(?::[0-9]+)?(?:/(?:[\\w=?:+/\\(\\)\\[\\]~&%;,._#-]*[\\w=?+/~&%-])?)?)|(?:mailt o: ?[a-z0-9+]+@[a-z0-9.-]+.[a-z]+)", RE.REG_ICASE);

сможешь его поправить как надо?

maxcom ★★★★★
()
Ответ на: комментарий от maxcom

>urlRE = new RE("(?:(?:(?:(?:https?://)|(?:ftp://)|(?:www\\.))|(?:ftp\\.))[a-z0-9.-]+\\.[a-z ]+(?::[0-9]+)?(?:/(?:[\\w=?:+/\\(\\)\\[\\]~&%;,._#-]*[\\w=?+/~&%-])?)?)|(?:mail t o: ?[a-z0-9+]+@[a-z0-9.-]+.[a-z]+)", RE.REG_ICASE);

> сможешь его поправить как надо?

Нет. Зато насчитал 15 смайликов.

Obey-Kun ★★★★★
() автор топика
Ответ на: комментарий от Obey-Kun

> Можно подождать мнения большинства:)

Звали? Я пришел. В общем, такое дело. Любой из вариантов будет лучше чем то, что сейчас.

anonymous
()
Ответ на: комментарий от maxcom

> (?:(?:(?:(?:https?://)|(?:ftp://)|(?:www\\.))|(?:ftp\\.))[a-z0-9.-]+\\.[a-z ]+(?::[0-9]+)?(?:/(?:[\\w=?:+/\\(\\)\\[\\]~&%;,._#-]*[\\w=?+/~&%-])?)?)|(?:mail t o: ?[a-z0-9+]+@[a-z0-9.-]+.[a-z]+)

например так:

(?:(?:(?:(?:https?://)|(?:ftp://)|(?:www\\.))|(?:ftp\\.))[a-z0-9.-]+\\.[a-z ]+(?::[0-9]+)?(?:/(?:(?:[\\w=?:+/\\[\\]~&%;,._#-]*[\\w=?+/~&%-])|(?:\\([^\\s\\) ]*\\)))*)?)|(?:mailt o: ?[a-z0-9+]+@[a-z0-9.-]+.[a-z]+)

либо, скорее всего, можно даже убрать лишние скобки (класса RE под рукой нет, проверить не могу):

(?:https?://|ftp://|www\\.|ftp\\.)[a-z0-9.-]+\\.[a-z ]+(?::[0-9]+)?(?:/(?:[\\w=?:+/\\[\\]~&%;,._#-]*[\\w=?+/~&%-]|\\([^\\s\\)]*\\))* )?|mailt o: ?[a-z0-9+]+@[a-z0-9.-]+.[a-z]+

Набор тестов, демонстрирующих функциональность, сейчас приложу.

Note: возможно, движок форума по ходу дела вставил в код несколько лишних пробелов, я не стал их удалять, т.к. не был уверен.

alexsaa
()
Ответ на: комментарий от alexsaa

#!/usr/bin/perl
use strict;
use utf8;
binmode STDOUT, ":utf8";

sub extract($) {
my $in = shift;

# ORIGINAL, FAILS TESTS
#return $& if $in =~ m<(?:(?:(?:(?:https?://)|(?:ftp://)|(?:www\.))|(?:ftp\.))[a-z0-9.-]+\.[a-z ]+(?::[0-9]+)?(?:/(?:[\w=?:+/\(\)\[\]~&%;,._#-]*[\w=?+/~&%-])?)?)|(?:mailt o: ?[a-z0-9+]+@[a-z0-9.-]+.[a-z]+)>;

# MODIFIED, PASSES TESTS
#return $& if $in =~ m<(?:(?:(?:(?:https?://)|(?:ftp://)|(?:www\.))|(?:ftp\.))[a-z0-9.-]+\.[a-z ]+(?::[0-9]+)?(?:/(?:(?:[\w=?:+/\[\]~&%;,._#-]*[\w=?+/~&%-])|(?:\([^\s\)]*\)))*
)?)|(?:mailt o: ?[a-z0-9+]+@[a-z0-9.-]+.[a-z]+)>;

# ...ALSO REMOVED UNNESSESARY GROUPS
return $& if $in =~ m<(?:https?://|ftp://|www\.|ftp\.)[a-z0-9.-]+\.[a-z ]+(?::[0-9]+)?(?:/(?:[\w=?:+/\[\]~&%;,._#-]*[\w=?+/~&%-]|\([^\s\)]*\))*)?|mailt o: ?[a-z0-9+]+@[a-z0-9.-]+.[a-z]+>;

# ...READABLE FORM
#return $& if $in =~ m<
#		(?:https?://|ftp://|www\.|ftp\.)
#		[a-z0-9.-]+\.[a-z ]+(?::[0-9]+)?
#		(?:/(?:
#			[\w=?:+/\[\]~&%;,._#-]* [\w=?+/~&%-] | \([^\s\)]*\)
#		)*)?
#	|
#	mailt o: ?[a-z0-9+]+@[a-z0-9.-]+.[a-z]+>x;


return ();
}

my $errors = 0;

sub test($$) {
my $in = shift;
my $expectedOut = shift;
my $actualOut = extract($in);
$errors++, print "\nFor:      '$in'\nExpected: '$expectedOut'\nBut got:  '$actualOut'\n\n" unless $expectedOut eq $actualOut;
}

test('', '');
test('hello world', '');
test('this is a simple link: http://www.ru/ and a text', 'http://www.ru/');
test('http://www.ru', 'http://www.ru');
test('http://www.ru/.', 'http://www.ru/');
test('http://www.ru/path', 'http://www.ru/path');
test('http://www.ru/path/', 'http://www.ru/path/');
test('http://www.ru/path.', 'http://www.ru/path');
test('http://www.ru/path/.', 'http://www.ru/path/');
test('http://www.ru/a.jpg', 'http://www.ru/a.jpg');
test('http://www.ru/a.jpg%20+b.jpg', 'http://www.ru/a.jpg%20+b.jpg');
test('That\'s a link: http://www.ru/a.jpg.', 'http://www.ru/a.jpg');
test('http://www.ru/a.jpg,', 'http://www.ru/a.jpg');
test('(http://www.ru/a.jpg),', 'http://www.ru/a.jpg');
test('http://www.ru/a.jpg...', 'http://www.ru/a.jpg');

test('(http://ru.wikipedia.org/wiki/Скобки_(значения))', 'http://ru.wikipedia.org/wiki/Скобки_(значения)');
test('(http://ru.wikipedia.org/wiki/Скобки_(зна)че(ния))', 'http://ru.wikipedia.org/wiki/Скобки_(зна)че(ния)');

#this test does not pass. It seems impossible to pass this test inregexp without back-tracing.
#test('(http://ru.wikipedia.org/wiki/Скобки_((значения)))', 'http://ru.wikipedia.org/wiki/Скобки_((значения))');

print $errors ? "Errors: $errors\n" : "All Ok!\n";

alexsaa
()

просто не надо ставить скобки сразу за ссылками. Ограничивать ссылки надо символами, не входящими в стандарт, например []<>, и парсить ссылки тоже по стандарту, без феерических костылей изображенных ниже.

Voker57 ★★
()
Ответ на: комментарий от true

я бы его и в постах вырубил. Хочу видеть всегда, куда ссылки ведут.

Voker57 ★★
()
Ответ на: комментарий от anonymous

>> просто не надо ставить скобки сразу за ссылками > Правда? > http://en.wikipedia.org/wiki/R-36_(missile) > Тест не пройден?

Я имел в виду не это, а вот это:

R-36 (http://en.wikipedia.org/wiki/R-36_(missile))

При правильной обработке в ссылку войдут две скобки. Во избежание этого надо такого избегать.

Voker57 ★★
()
Ответ на: комментарий от Voker57

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

Obey-Kun ★★★★★
() автор топика
Ответ на: комментарий от Obey-Kun

Нет, это не правильная обработка ссылки, а костыли. А если я захочу дать ссылку на [http://mycoolsite/pazitiffchik))))))))))))))]?

Voker57 ★★
()
Ответ на: комментарий от Voker57

Правильная обработка ссылки это по стандарту, когда все допустимые в URI символы, идущие подряд, считаются частью ссылки.

Voker57 ★★
()
Ответ на: комментарий от maxcom

(?:(?:(?:(?:https?://)|(?:ftp://)|(?:www\\.))|(?:ftp\\.))[a-z0-9.-]+\\.[a-z]+(?
::[0-9]+)?(?:/(?:([\\w=?:+/\\[\\]~&%;,._#-]|(\\([^\\)]*\\)))*([\\w=?+/~&%-]|(\\(
[^\\)]*\\))))?)?)|(?:mailt o: ?[a-z0-9+]+@[a-z0-9.-]+.[a-z]+)

работает так http://pic.ipicture.ru/uploads/081210/3zYtJ3OGTD.jpg

вот версия без экранирования слешей

(?:(?:(?:(?:https?://)|(?:ftp://)|(?:www\.))|(?:ftp\.))[a-z0-9.-]+\.[a-z]+(?::[
0-9]+)?(?:/(?:([\w=?:+/\[\]~&%;,._#-]|(\([^\)]*\)))*([\w=?+/~&%-]|(\([^\)]*\))))
?)?)|(?:mailt o: ?[a-z0-9+]+@[a-z0-9.-]+.[a-z]+)

ps. имхо слишком навороченно, проще сделать отбивку пробелами. Прошу извенить за преформаттед, ибо иначе втыкает пробелы

wfrr ★★☆
()
Ответ на: комментарий от Voker57

Дело говоришь, но тут каста любителей костылей

wfrr ★★☆
()
Ответ на: комментарий от wfrr

гениально... надеюсь, что примут.

Obey-Kun ★★★★★
() автор топика
Ответ на: комментарий от Obey-Kun

Из-за тебя лично придется писать парсер на конечных автоматах, не жирно? Если знаешь как произвольную вложенность выразить регекспами то вуаля — пишы а не ищи смайлики.

wfrr ★★☆
()
Ответ на: комментарий от wfrr

>С моей логикой нужно отбивать пробелами

Это не по-русски. И даже не по-английски.

А что по твоей логике на счёт знаков препинания после www.ru?

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

то что я могу засунуть в урл любой символ, воть что.

wfrr ★★☆
()
Ответ на: комментарий от alexsaa

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

wfrr ★★☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.