Javascript-форум (https://javascript.ru/forum/)
-   Ваши сайты и скрипты (https://javascript.ru/forum/project/)
-   -   поиск ссылок на странице (https://javascript.ru/forum/project/23691-poisk-ssylok-na-stranice.html)

devote 04.12.2011 10:57

Цитата:

Сообщение от trikadin
devote, на самом деле, более хорошим решением (на мой взгляд) будет не заматчивание этой ссылки. Потому что далеко не все люди ставят пробелы перед дефисом, как это не печально:

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

Gozar 04.12.2011 11:03

Т.к. в адресную строку теперь пихают не только английские символы, то я решил не усложнять дальше регу, как предполагалось изначально:
В консоль:
' ссылками:[url]www.google.ru[/url] даже проверь свою регу.,карту google.ru.maps [url]http://maps.google.ru/maps/pre-fixфыва[/url] бла тестссылка:[url]http://дердымцопцоп,.ru/[/url] ну ылку: [url]http://testdomen/blabla/[/url] за ссылку, [url]http://votrube.ru/uploads/posts/2011-12/1322827006_-(www.votrube.ru)2.jpg или просто http://ru,.ru/ну или просто тhttp://translate.google.ru/?js=n&prev=_t&hl=ru&ie=UTF-8&layout=2&eotf=1&sl=en&tl=ru&text=Possibly+another+solution+would+be+to+have+the+description+text+hidden+by+default+and+only+shows+when+the+title+is+focused%2Fhovered+over.%0D%0A%0D%0A+Here%27s+an+example%3A+http%3A%2F%2Fwww.1true.co.uk%2Ffastscroll.html&file=#en|ru|Mistletoe,'.replace("\[(\\)?url\]").replace(/\[[/]?url\]/g,"").match(/(http(s)?:\/\/)?(www\.)?([-.a-z0-9]+)\.(ru|com|net){1}((\/)+[-$_.,+=:;/|?@&#%a)(-z0-9]+)?(?=\b)/ig)


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

Цитата:

Сообщение от devote (Сообщение 140645)
Ну ты насмешил... Если уж на то пошло, то тогда вообще придумывать эти реги нет смысла, люди могут что угодно сделать и как угодно написать... всем все равно не угодишь... поэтому если юзер глупый, то понятно дело что он будет ссылку дополнять чем угодно... У меня таких знакомых и друзей нет, которые дописывают что-то в ссылку... Это ссылка и она обязана быть разделена пробелом... Если люди этого не понимают, их проблемы.

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

ps: replace(/\[[/]?url\]/g,"") просто вырезает ненужные [url] этого форума

devote 04.12.2011 11:08

Цитата:

Сообщение от Gozar
Вообще-то это проблемы людей, которые потом будут читать текст и не смогут в один клик перейти по ссылке.

Человек, который элементарно не может отделить ссылку от текста, врядли напишет что-то дельное... Это мое мнение, я вас не заставляю его придерживаться. Если человек пишет дельную статью, сомневаюсь что он ее напишет в одной строке. ИМХО

trikadin 04.12.2011 11:11

Цитата:

Сообщение от devote
Ну ты насмешил... Если уж на то пошло, то тогда вообще придумывать эти реги нет смысла, люди могут что угодно сделать и как угодно написать... всем все равно не угодишь... поэтому если юзер глупый, то понятно дело что он будет ссылку дополнять чем угодно... У меня таких знакомых и друзей нет, которые дописывают что-то в ссылку... Это ссылка и она обязана быть разделена пробелом... Если люди этого не понимают, их проблемы.

Рад, что поднял вам настроение) Но вообще, я не собирался этого делать. Я привёл пример, который иллюстрирует мои слова. Дело не в глупости пользователя - он не знает (и не обязан знать), как работает ваш регулярное выражение. Поэтому, если он скинет другу ссыль типа такой:
Цитата:

http://google.ru-смотри тот сайт про который я говорил
(да-да, среднестатистический пользователь пишет безграмотно) - то ваша рега сделает ссылкой это: "http://google.ru-смотри". Что не круто.

trikadin 04.12.2011 11:12

Цитата:

Сообщение от devote
Человек, который элементарно не может отделить ссылку от текста, врядли напишет что-то дельное... Это мое мнение, я вас не заставляю его придерживаться. Если человек пишет дельную статью, сомневаюсь что он ее напишет в одной строке. ИМХО

С точки зрения человека, дефис - нормальный такой отделяющий символ...

Gozar, а можно посмотреть ваш вариант в действии?)

Gozar 04.12.2011 11:14

Цитата:

Сообщение от trikadin (Сообщение 140651)
а можно посмотреть ваш вариант в действии?)

Тот, который я пишу или тот который выше "В консоль:"?

там добавлено: replace(/\[[/]?url\]/g,"") для чистоты эксперимента

devote 04.12.2011 11:16

Цитата:

Сообщение от trikadin
Что не круто.

Ну значит я из числа большенства, которые не думают о тех кто приписывает дополнительные параметры ссылки... представляю америкосов, у них что в тексте что в ссылке одни и теже латинкие буквы... представляю пишет чел "http://google.ru-see is cool" и что же тогда делать амерскому прогеру? разбираться где ссыль а где текст? учить грамоте скрипт? На сегодняшний день, большая часть сайтов юзает знак дефис в ссылках... дык что тупо их резать чтоль?

trikadin 04.12.2011 11:18

Цитата:

Сообщение от Gozar
"В консоль:"

Не заметил, виноват.

Кстати, в расширенном режиме, внизу есть галка ("Автоматически вставлять ссылки"), которую надо убирать, чтобы не было [url].

Gozar 04.12.2011 11:19

Цитата:

Сообщение от devote (Сообщение 140654)
дык что тупо их резать чтоль?

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

devote 04.12.2011 11:20

единственно е в чем я согласен, дык это в том что апосля доменного имени ничего кроме слеша не должно быть... тоесть в правило нужно добавить исключение что бы такие http://google.ru-blah домены он не ел... а если ссылка указана так: http://google.ru/-blah то это полноценная ссыль

Gozar 04.12.2011 11:20

Цитата:

Сообщение от trikadin (Сообщение 140655)
в расширенном режиме, внизу есть галка ("Автоматически вставлять ссылки")

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

Gozar 04.12.2011 11:23

Хотя этот ответ скорее относится devote ;)

trikadin 04.12.2011 11:25

Gozar, "http://testdomen/blabla/" - не заматчило - это by design?

devote, просто сделать выбор - матчить дефис или нет. :D Каждый выбирает по себе) Из примеров, кто не матчит - контакт. Пока не вспомню больше...

trikadin 04.12.2011 11:25

Цитата:

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

Спокойно) Мне не было жалко времени - я вам подсказал) Это нормально)

Gozar 04.12.2011 11:28

Цитата:

Сообщение от trikadin (Сообщение 140660)
Gozar, "http://testdomen/blabla/" - не заматчило - это by design?

Так и не должно, хотя в домене верхнего уровня такая ссылка возможна, но это скорее из разряда экзотики.

devote 04.12.2011 11:29

вот ссылка на этот пост : http://javascript.ru/forum/project/2...tranice-5.html и что ее порезать надо до http://javascript.ru/forum/project/23691 и кому она уже нужна будет?

Gozar 04.12.2011 11:31

var a = 'Крутая:http://javascript.ru/forum/project/23691-poisk-ssylok-na-stranice-5.html-ссылка'.match(/(http(s)?:\/\/)?(www\.)?([-.a-z0-9]+)\.(ru|com|net){1}((\/)+[-$_.,+=:;/|?@&#%a)(-z0-9]+)?(?=\b)/ig); alert(a)

trikadin 04.12.2011 11:36

Discussio mater veritas est. :D

devote 04.12.2011 11:41

Цитата:

Сообщение от Gozar (Сообщение 140665)
var a = 'Крутая:http://javascript.ru/forum/project/23691-poisk-ssylok-na-stranice-5.html-ссылка'.match(/(http(s)?:\/\/)?(www\.)?([-.a-z0-9]+)\.(ru|com|net){1}((\/)+[-$_.,+=:;/|?@&#%a)(-z0-9]+)?(?=\b)/ig); alert(a)

Ну дык не удивительно что твая рега работает... он же русские символы выкидывает нафиг...

а так она не заработает:

var a = 'Cool:http://javascript.ru/forum/project/23691-poisk-ssylok-na-stranice-5.html-link'.match(/(http(s)?:\/\/)?(www\.)?([-.a-z0-9]+)\.(ru|com|net){1}((\/)+[-$_.,+=:;/|?@&#%a)(-z0-9]+)?(?=\b)/ig); alert(a)
Короче что бы тут не говорили, одно регой всеравно все не сделаешь, в любом случае нужно писать еще не одну регу и код, что бы четко определить что к чему.

Gozar 04.12.2011 12:00

devote,
В твоей ссылке вообще невозможно на программном уровне правильно определить сслыку, кроме как перейти по ней и проверить последовательно отсекая символы с конца.
Цитата:

Сообщение от devote (Сообщение 140668)
Короче что бы тут не говорили, одно регой всеравно все не сделаешь, в любом случае нужно писать еще не одну регу и код, что бы четко определить что к чему.

Я уже сказал что, так решать задачу не имеет смысла.

devote 04.12.2011 12:03

Gozar,
Я и не пытаюсь что-то доказать, возьмем к примеру ссылку: http://президент.рф/документы
если писать ее так http://президент.рф/документы-ссылка понятно дело что не поймешь где ссыль а где нет... Я пример указывал именно в плане трансляции... ибо ссылки бывают на разных языках.

Gozar 04.12.2011 12:21

Цитата:

Сообщение от devote (Сообщение 140674)
возьмем к примеру ссылку: http://президент.рф/документы
если писать ее так http://президент.рф/документы-ссылка понятно дело что не поймешь где ссыль а где нет...

В рамках двух языков я подобную проблему уже решал, для этого программа обучается(расширяется), сравнение по базе вполне подходит.

devote 04.12.2011 12:27

Цитата:

Сообщение от Gozar
В рамках двух языков я подобную проблему уже решал, для этого программа обучается(расширяется), сравнение по базе вполне подходит.

Об этом и речь, что одной регой не обойдешься... Писать нужно не мало, и ради ссылок нагружать сервак я лично не считаю оправданным... Ибо ссылка может быть очень длинной а сравнение строк занимает время. Если не говорить о сервере, то таже ситуация и на стороне клиента будет... Лишняя нагрузка. Что не всегда эффективно например в динамических сайтах/страницах... В общем дело выбора и случая, если сайт визитка, можно хоть до попы нагрузить скрипт обработки ссылок. Если большой контент и много динамики, это не годиться и придется пользоваться простым решением. В общем моя рега считается простым решением, которая не требует большой доработки и лишнего кода.

Gozar 04.12.2011 12:30

Цитата:

Сообщение от devote (Сообщение 140678)
Если не говорить о сервере, то таже ситуация и на стороне клиента будет... Лишняя нагрузка.

Чур не притягивать за уши.

trikadin 04.12.2011 13:14

Короче, то же самое, что и с емейлами… Можно проверять кучей кода, а можно забить и пользоваться простой регой…

devote 04.12.2011 13:18

Цитата:

Сообщение от trikadin
а можно забить и пользоваться простой регой…

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

Хотя если заказчик потребует, то конечно уделю =))) За его то счет)))

Gozar 04.12.2011 14:14

Цитата:

Сообщение от devote (Сообщение 140686)
ибо уделять огромное внимание простым ссылкам не вижу смысла.

Всё зависит от той задачи, которая перед тобой стоит.

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

Просто тебе не попадались подобные задачи видимо. В некоторых из них подобная проблема стоит на главном месте.

devote 04.12.2011 16:43

Цитата:

Сообщение от Gozar
Всё зависит от той задачи, которая перед тобой стоит.

Вот с этого и надо было начинать разговаривать... Да мне не попадался еще ни один проект где это прям нужно было реализовывать. Может просто потому что я не пишу сайты для русских!? Ибо америкосы не просят этого, точнее не просили, хотя на моем счету уже не одна сотня проектов. Так что если все же найдется тот кто захочет что-то подобное, вот тогда и буду сидеть задумываться что к чему. Но за много лет работы, увы никто не просил.

Цитата:

Сообщение от devote
а где-то можно сильно пожалеть о том, что не проверил дополнительной регой или куском программы.

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

Gozar 04.12.2011 17:15

Цитата:

Сообщение от devote (Сообщение 140712)
Вот с этого и надо было начинать разговаривать...

Каждый сам решает для себя с чего начинать разговор.
Цитата:

Сообщение от devote (Сообщение 140712)
Пример можно? не совсем понимаю

А смысл? Не вижу в этом смысла, т.к. разговор давно зашел в тупик начиная со слов:
Цитата:

Сообщение от Gozar (Сообщение 140646)
а пойти другим путем

тему можно было не продолжать, пережевывая одно и тоже.

Цитата:

Сообщение от devote (Сообщение 140712)
Просто понять не могу на что может повлиять кривое отображение

тема называется: поиск ссылок на странице, а не их отображение.

Gozar 04.12.2011 21:06

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

Известно что в js отсутствует ретроспективная проверка, поэтому я тут изголился и придумал следующее:
split("").reverse().join("")
и тогда можно снова проверять сначала, то есть это и будет ретроспективная проверка, затем снова реверс и всё ок. Потом мне стало интересно, неужели никто до этого не допёр и не мучился с подобным, оказалось этому даже название есть: Mimicking lookbehind through reversal

devote 04.12.2011 23:11

Вот начирикал последний вариант, удаляет знаки препинания и вские там символы в конце ссылки...
var a = [
    'Привет, на вот зацени ссылку: "http://test.ru/blablablah.html?test=param&qwerty#anchor." это крутая ссыль =) и вот еще www.google.ru, www.tarampampam.com!!! и вот еще файлик на ФТП ftp://tarampampam.ru/file.zip.',

    'http://translate.google.ru/?js=n&prev=_t&hl=ru&ie=UTF-8&layout=2&eotf=1&sl=en&tl=ru&text=Possibly+another+solution+would+be+to+have+the+description+text+hidden+by+default+and+only+shows+when+the+title+is+focused%2Fhovered+over.%0D%0A%0D%0A+Here%27s+an+example%3A+http%3A%2F%2Fwww.1true.co.uk%2Ffastscroll.html&file=#en|ru|blah',

    'http://президент.рф/документы',

    '"http://testdomen/blabla/" - не заматчило - это by design?',

    'Крутая:http://javascript.ru/forum/project/23691-poisk-ssylok-na-stranice-5.html-ссылка',

    'http://дердымцопцоп,.ru/',

    'http://votrube.ru/uploads/posts/2011-12/1322827006_-(www.votrube.ru)2.jpg',

    'http://yandex.ru-хорошая ссылка'
];

for( var b, i = 0; i < a.length; i++ ) {
b = a[i].match( /(?:(http(?:s)?|ftp)(:\/\/)|(www(?:[0-9]+)?\.))((?:([^`~!@#$%^&*()_+|=\\{}\[\];:'"<,>?\/\s]+)\/[^\s]+(?!\s|$)[^`~!@#$%^&*()_+|=\\{}\[\];:'"<,.>\-?\s]+)|([^`~!@#$%^&*()_+|=\\{}\[\];:'"<,>?\/\s]+))/ig );

alert(b);
}

devote 04.12.2011 23:19

Ну хоть такая рега покатит вам? Щас она убивает знаки препинания не нужные в конце ссыли. И реверсов не надо делать.

devote 04.12.2011 23:57

хотя есть ссылки содержащие имя пользователя и пароль в ссылке, для этого можно убрать из запрещенных два символа ":@" тоесть двоеточие и сабаку.

примерно так:
var a = '"ftp://username:password@domen.net/path/path/file.dat"'.
match( /(?:(http(?:s)?|ftp)(:\/\/)|(www(?:[0-9]+)?\.))((?:([^`~!#$%^&*()_+|=\\{}\[\];'"<,>?\/\s]+)\/[^\s]+(?!\s|$)[^`~!@#$%^&*()_+|=\\{}\[\];:'"<,.>\-?\s]+)|([^`~!#$%^&*()_+|=\\{}\[\];'"<,>?\/\s]+))/ig );
alert(a);

Gozar 05.12.2011 00:01

devote,
Всё хорошо, за исключением того, что это http://дердымцопцоп она найти не должна была. Спасибо за участие. Твоей регой можно будет прогонять ссылку как дополнительным фильтром, без реверса. Хотя возможно это не потребуется, если немного изменить первую часть.

devote 05.12.2011 00:14

Gozar,
Хоть покажешь полный результат? Когда закончишь делать полноценный фильтр ссылок. А насчет то ссыли, можно добавить что бы он не хватал локальные ссылки, тоесть без домена первого уровня. Это примерно так:

var a = [ 
    'Привет, на вот зацени ссылку: "http://test.ru/blablablah.html?test=param&qwerty#anchor." это крутая ссыль =) и вот еще www.google.ru, www.tarampampam.com!!! и вот еще файлик на ФТП ftp://tarampampam.ru/file.zip.', 
  
    'http://translate.google.ru/?js=n&prev=_t&hl=ru&ie=UTF-8&layout=2&eotf=1&sl=en&tl=ru&text=Possibly+another+solution+would+be+to+have+the+description+text+hidden+by+default+and+only+shows+when+the+title+is+focused%2Fhovered+over.%0D%0A%0D%0A+Here%27s+an+example%3A+http%3A%2F%2Fwww.1true.co.uk%2Ffastscroll.html&file=#en|ru|blah', 
  
    'http://президент.рф/документы', 
  
    '"http://testdomen/blabla/" - не заматчило - это by design?', 
  
    'Крутая:http://javascript.ru/forum/project/23691-poisk-ssylok-na-stranice-5.html-ссылка', 
  
    'http://дердымцопцоп,.ru/', 
  
    'http://votrube.ru/uploads/posts/2011-12/1322827006_-(www.votrube.ru)2.jpg', 
  
    'http://yandex.ru-хорошая ссылка'
]; 
  
for( var b, i = 0; i < a.length; i++ ) { 
b = a[i].match( /(?:(http(?:s)?|ftp)(:\/\/)|(www(?:[0-9]+)?\.))([^`~!@#$%^&*()_+|=\\{}\[\];:'"<,>?\/\s]+)\.((?:([^`~!@#$%^&*()_+|=\\{}\[\];:'"<,>?\/\s]+)\/[^\s]+(?!\s|$)[^`~!@#$%^&*()_+|=\\{}\[\];:'"<,.>\-?\s]+)|([^`~!@#$%^&*()_+|=\\{}\[\];:'"<,>?\/\s]+))/ig ); 
  
alert(b); 
}

Gozar 05.12.2011 00:25

Цитата:

Сообщение от devote (Сообщение 140775)
Хоть покажешь полный результат?

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

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

devote 05.12.2011 00:47

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

var a = [  
    'Привет, на вот зацени ссылку: "http://test.ru/blablablah.html?test=param&qwerty#anchor." это крутая ссыль =) и вот еще [url]www.google.ru[/url], [url]www.tarampampam.com[/url]!!! и вот еще файлик на ФТП ftp://tarampampam.ru/file.zip.',  
    
    'http://translate.google.ru/?js=n&prev=_t&hl=ru&ie=UTF-8&layout=2&eotf=1&sl=en&tl=ru&text=Possibly+another+solution+would+be+to+have+the+description+text+hidden+by+default+and+only+shows+when+the+title+is+focused%2Fhovered+over.%0D%0A%0D%0A+Here%27s+an+example%3A+http%3A%2F%2Fwww.1true.co.uk%2Ffastscroll.html&file=#en|ru|blah',  
    
    'http://президент.рф/документы',  
    
    '"http://testdomen/blabla/" - не заматчило - это by design?',  // не корректная ссылка, нет верхнего домена
    
    'Крутая:http://javascript.ru/forum/project/23691-poisk-ssylok-na-stranice-5.html-ссылка',  
    
    'http://дердымцопцоп,.ru/',  // не корректная ссылка
    
    'http://votrube.ru/uploads/posts/2011-12/1322827006_-(www.votrube.ru)2.jpg',  
    
    'http://yandex.ru-хорошая ссылка',

    'ftp://username:password@domen/blah/', // не корректная нет верхнего домена

    'ftp://username:password@domen.ru/blah/',

    'ftp://password@domen.ru/blah/',  // допустимая ссылка

    'ftp://username:@domen.ru/blah/',   // допустимая ссылка

    'ftp://username:domen.ru/blah/',  // не корректная ссылка

    'ftp://username@:domen.ru/blah/',  // не корректная ссылка

    'http://blah.ru:8089',

    'http://blah.ru:8080/lalalala/',

    'ftp://username:password@domen.ru:3131/blah/'
]; 

for( var b, i = 0; i < a.length; i++ ) {  
b = a[i].match( /(?:(http(?:s)?|ftp)(:\/\/)(?:[^:]+(?::)?[^@]+@)?|(?:[^:]+(?::)?[^@]+@)?(www(?:[0-9]+)?\.))([^`~!@#$%^&*()_+|=\\{}\[\];:'"<,>?\/\s]+)\.((?:([^`~!@#$%^&*()_+|=\\{}\[\];:'"<,>?\/\s]+)(?::[0-9]+)?\/[^\s]+(?!\s|$)[^`~!@#$%^&*()_+|=\\{}\[\];:'"<,.>\-?\s]+)|([^`~!@#$%^&*()_+|=\\{}\[\];:'"<,>?\/\s]+)(?::[0-9]+)?)/ig );  
    
alert(b);
}

devote 05.12.2011 00:57

номера портов добавил... про них то я подзабыл)))

Aetae 05.12.2011 02:09

А теперь ещё придумайте как оборачивать такие ссылки:
http://<u>www.<b>google</b>.ru</u>/#q=trololo
*trollface.jpg*

trikadin 05.12.2011 02:24

replace(/<\/?\S*?>/g)


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