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

Gozar 02.12.2011 11:46

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

var a = 'ссылка на карту google maps http://maps.google.ru/maps/pre-fix/фыва'.
match(/(http(s)?:\/\/)?(www\.)?([-.a-z0-9]+)\.(ru|com|net)([-$_.,+=:;/?@&#%a-z0-9]+)?(\/|\b)/i);
alert(a[0]);


Будет желание тестим наздоровье. Очень хорошо если кто-то найдет непроходящий проверку урл. Получит плюшку и мишку в подарок, от бондюэль(требовать в любом магазине бондюэль) :)

devote 02.12.2011 13:12

к чему это? то есть что ты этим хочешь показать? мол учите PRCE дети =)))

Gozar 02.12.2011 13:32

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

Цитата:

Сообщение от Gozar (Сообщение 140324)
Будет желание тестим на здоровье.

Если смущает ссылка на тему могу убрать.

devote 02.12.2011 13:45

Gozar,
ну ясно, просто рега не особо универсальна, она будет требовать изменений, ибо домены верхнего уровня есть не только ru, com, net...

Gozar 02.12.2011 13:46

Цитата:

Сообщение от devote (Сообщение 140339)
Gozar,
ну ясно, просто рега не особо универсальна, она будет требовать изменений, ибо домены верхнего уровня есть не только ru, com, net...

ты опять стреляешь мимо темы, мне интересно не это, домены можно перечислить все.

devote 02.12.2011 13:48

и да ссылки такого вида: http://maps.google.ru./maps/pre-fix/фыва тоже никто не запрещает юзать

Gozar 02.12.2011 13:49

devote,
Бесишь:
Цитата:

Сообщение от Gozar (Сообщение 140324)
русские символы не брал в расчет, домены тоже указаны специально точные.


devote 02.12.2011 13:51

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

devote 02.12.2011 14:10

вот, верхний твой вариант, нижний мой:
var a = 'ссылка на карту google.ru.maps [url]http://maps.google.ru/maps/pre-fix/фыва[/url] бла тест'.
match(/(http(s)?:\/\/)?(www\.)?([-.a-z0-9]+)\.(ru|com|net)([-$_.,+=:;/?@&#%a-z0-9]+)?(\/|\b)/i);
alert(a[0]);

var a = 'ссылка на карту google.ru.maps [url]http://maps.google.ru/maps/pre-fix/фыва[/url] бла тест'.
match( /((http(s)?:\/\/)|(www\.))([^\.]+)\.([^\s]+)/i );
alert(a[0]);

devote 02.12.2011 14:13

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

Gozar 02.12.2011 14:57

Цитата:

Сообщение от devote (Сообщение 140349)
вот ... мой:
var a = 'ссылка на карту google.ru.maps [url]http://maps.google.ru/maps/pre-fix/фыва[/url] бла тест'.
match( /((http(s)?:\/\/)|(www\.))([^\.]+)\.([^\s]+)/i );
alert(a[0]);

google.ru тоже ссылка без maps

Спасибо, добавил провеку на точку в конце:

var a='ссылка на карту google.ru.maps выф[url]http://maps.google.ru/maps/pre-fix/фыва[/url] бла тест'.match(/(http(s)?:\/\/)?(www\.)?([-.a-z0-9]+)\.(ru|com|net){1}((\/)+[-$_.,+=:;/?@&#%a-z0-9]+)?(\/|\b)/ig);
alert(a);

Gozar 02.12.2011 15:15

Твой вариант(найдена одна, ни одна из первых не найдена), также смотри на окончание
var a = 'ссылка на карту google.ru.maps maps.google.ru/maps/pre-fix/фыва бла тест ссылка на картуhttp://maps.google.ru/maps/place?q=59.944215,30.307012,блатест'.match( /((http(s)?:\/\/)|(www\.))([^\.]+)\.([^\s]+)/i );
alert(a);


Мой вариант(найдено три)
var a = 'ссылка на карту google.ru.maps maps.google.ru/maps/pre-fix/фыва бла тест ссылка на картуhttp://maps.google.ru/maps/place?q=59.944215,30.307012,блатест'.match(/(http(s)?:\/\/)?(www\.)?([-.a-z0-9]+)\.(ru|com|net){1}((\/)+[-$_.,+=:;/?@&#%a-z0-9]+)?(\/|\b)/ig);
alert(a);

devote 02.12.2011 15:33

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

тоесть так не найдет:
var a = 'ссылка на карту google.ru.maps maps.google.ru/maps/pre-fix/фыва бла тест ссылка на картуhttp://maps.google.ru/maps/place?q=59.944215,30.307012,блатест'.match( /(?:^|[\s]+)((http(s)?:\/\/)|(www\.))([^\.]+)\.([^\s]+)/i );
alert(a);

а так найдет:
var a = 'ссылка на карту google.ru.maps maps.google.ru/maps/pre-fix/фыва бла тест ссылка на карту http://maps.google.ru/maps/place?q=59.944215,30.307012,блатест'.match( /(?:^|[\s]+)((http(s)?:\/\/)|(www\.))([^\.]+)\.([^\s]+)/i );
alert(a);

Gozar 02.12.2011 15:41

Цитата:

Сообщение от devote (Сообщение 140366)
единственное что нужно запретить

Запретить кому?

И почему должна быть запрещена ссылка вида
//'ссылка:http://ya.ru?'

devote 02.12.2011 15:42

Цитата:

Сообщение от Gozar
Запретить кому?

У меня в регулярке, сорри что не написал подробности... я в посте выше добавил в регу правило что бы перед ссылкой был либо пробел либо начало строки... Тоесть ссылка начинающая с "blahttp://" не может быть ссылкой, это показано в первом примере... а во втором стоит пробел перед ссылкой

devote 02.12.2011 15:42

Цитата:

Сообщение от Gozar
Запретить кому?

И почему должна быть запрещена ссылка вида//ссылка:http://ya.ru?

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

Gozar 02.12.2011 15:44

Видишь знак вопросика в конце ссылки?

У тебя также.

Gozar 02.12.2011 15:51

Твой вариант:
var a = 'ссылка на карту бла тест ссылка на эта ссылка: [url]http://maps.google.ru/maps/place?q=59.944215,30.307012?[/url] ,блатест'.match( /(?:^|[\s]+)((http(s)?:\/\/)|(www\.))([^\.]+)\.([^\s]+)/i );alert(a);

Баг форума, у тебя на самом деле возвращает тот же урл, но в конце у него знак вопроса.

Мой вариант:
var a = 'ссылка на карту бла тест ссылка на эта ссылка: [url]http://maps.google.ru/maps/place?q=59.944215,30.307012?[/url] ,блатест'.match(/(http(s)?:\/\/)?(www\.)?([-.a-z0-9]+)\.(ru|com|net){1}((\/)+[-$_.,+=:;/?@&#%a-z0-9]+)?(\/|\b)/ig);alert(a);

devote 02.12.2011 15:56

а что плохого в том что знак вопроса попал в ссылку? как мне говорит PHP тык он не против иметь хоть двадцать вопросов в ссылке, в переменной $_SERVER['REQUEST_URI'] отобразить хоть сотню... так что я могу спокойно писать сайт с учетом подобных ссылок.

Gozar 02.12.2011 15:56

зы: ты экранируешь точку в символьном классе:
[quote=devote;140366]
[^\.]

а зачем?

Gozar 02.12.2011 15:58

Цитата:

Сообщение от devote (Сообщение 140377)
а что плохого в том что знак вопроса попал в ссылку?

Тоже почему у тебя будут все ссылки кривыми, которые заканчиваются на запятые и точки и восклицательные знаки или их тоже пользователю запретить ставить?

devote 02.12.2011 16:02

[quote=Gozar]зы: ты экранируешь точку в символьном классе:
Цитата:

Сообщение от devote (Сообщение 140366)
показать чистый исходник в новом окнеСкрыть/показать номера строкпечать кода с сохранением подсветки1[^\.]
а зачем?

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


Цитата:

Сообщение от Gozar
Тоже почему у тебя будут все ссылки кривыми, которые заканчиваются на запятые и точки и восклицательные знаки или их тоже пользователю запретить ставить?

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

Gozar 02.12.2011 16:11

Цитата:

Сообщение от devote (Сообщение 140380)
что бы в имене домена обязалова был хоть одна точка...

Я не спрашиваю для чего ты это делаешь, я спрашиваю только про экранирование точки. Внутри символьного класса точка является тем чем она является - точкой. Зачем её экранировать?

Цитата:

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

Почему глупо? Запятую тоже глупо ставить? По правилам русского языка вроде ставится запятая без пробела. Ты же по крайней мере ставишь без пробела запятую.

devote 02.12.2011 16:14

вот для примера есть гугловская ссылка:

мой:
var a = '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'.match( /(?:^|[\s]+)((http(s)?:\/\/)|(www\.))([^\.]+)\.([^\s]+)/i );alert(a);


вот как примет ее твоя рега, в ней же и точки и куча борохла:
var a = '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'.match(/(http(s)?:\/\/)?(www\.)?([-.a-z0-9]+)\.(ru|com|net){1}((\/)+[-$_.,+=:;/?@&#%a-z0-9]+)?(\/|\b)/ig);alert(a);

devote 02.12.2011 16:15

Цитата:

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

привычка =))) хуже то от этого не становиться)))

Gozar 02.12.2011 16:51

Цитата:

Сообщение от devote (Сообщение 140383)
вот как примет ее твоя рега, в ней же и точки и куча борохла:

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

var a='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,'.match(/(http(s)?:\/\/)?(www\.)?([-.a-z0-9]+)\.(ru|com|net){1}((\/)+[-$_.,+=:;/|?@&#%a-z0-9]+)?(\/|\b)/ig);
alert(a);

Gozar 02.12.2011 17:00

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

devote 02.12.2011 17:02

Цитата:

однако в твоей запятые в конце продолжают попадают в выборку.
ну дык этон не проблема засунуть в регу один символ запятой:
var a = '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,'.
match( /(?:^|[\s]+)((http(s)?:\/\/)|(www\.))([^\.]+)\.(?:[^\s,]+)/ig );
alert(a);

devote 02.12.2011 17:03

Цитата:

Сообщение от Gozar
Оговорюсь, что я не ставлю цель доказать что моя рега лучше или хуже. Только сравнительные характеристики, виды урлов и их контекст и выбор наиболее оптимального варианта.

Вот это и проблема, что для каждого случая свои плюсы и минусы в любой реге... Поэтому тут как правило пишется от конкретных требований. Я не хочу например считать ссылкой просто надпись google.ru ты же наоборот хочешь это воспринимать как ссылку... и т.д.

Gozar 02.12.2011 17:12

Цитата:

Сообщение от devote (Сообщение 140410)
Я не хочу например считать ссылкой просто надпись google.ru ты же наоборот хочешь это воспринимать как ссылку.

Здесь я с тобой не соглашусь потому, что интуитивно понятно, что это адрес в интернете.

devote 02.12.2011 17:40

Цитата:

Сообщение от Gozar
Здесь я с тобой не соглашусь потому, что интуитивно понятно, что это адрес в интернете.

Не спорю, но моя рега считает ссылками www.google.ru даже Илья на этом сайте решил не считать google.ru ссылками, как ты видишь.

Gozar 02.12.2011 17:55

Цитата:

Сообщение от devote (Сообщение 140421)
Не спорю, но моя рега считает ссылками www.google.ru даже Илья на этом сайте решил не считать google.ru ссылками, как ты видишь.

зато он решил считать ссылками:
http://maps.google.ru./

как собственно и ты.

или вот такие:
http://www.ya.рф

devote 02.12.2011 18:06

Цитата:

Сообщение от Gozar
зато он решил считать ссылками:
http://maps.google.ru./

как собственно и ты.

потому что это полноценная ссылка, рабочая и без каких либо ошибок... Тоесть точка апосля домена не запрещена, а даже по правилам так и должна быть... просто браузеры точку вконце домена обычно сами добавляют. Прозрачно для пользователя.

Gozar 02.12.2011 18:10

http://якцопцоп.ru

Gozar 02.12.2011 18:16

http://дердымцопцоп,.ru/ ну или просто http://ru,.ru/
проверь свою регу.

а моя не проходит: http://..ru/

devote 02.12.2011 18:40

не находит:
var a = 'http://..ru/'. 
match( /(?:^|[\s]+)((http(s)?:\/\/)|(www\.))([^\.]+)\.(?:[^\s,]+)/ig ); 
alert(a);

находит:
var a = 'http://ru,.ru/'. 
match( /(?:^|[\s]+)((http(s)?:\/\/)|(www\.))([^\.]+)\.(?:[^\s,]+)/ig ); 
alert(a);


исправленная:
var a = 'http://ru,.ru/'. 
match( /(?:^|[\s]+)((http(s)?:\/\/)|(www\.))([^.,]+)\.(?:[^\s,]+)/ig ); 
alert(a);

исправленная (русская ссылка):
var a = 'http://ру.ru/'. 
match( /(?:^|[\s]+)((http(s)?:\/\/)|(www\.))([^.,]+)\.(?:[^\s,]+)/ig ); 
alert(a);

x-yuri 04.12.2011 00:16

возможно эта ссылка будет в тему

trikadin 04.12.2011 01:28

Хочу плюшку!

var a = 'http://votrube.ru/uploads/posts/2011-12/1322827006_-(www.votrube.ru)2.jpg'; //ссыль реальная
has= a.match(/(http(s)?:\/\/)?(www\.)?([-.a-z0-9]+)\.(ru|com|net){1}((\/)+[-$_.,+=:;/|?@&#%a-z0-9]+)?(\/|\b)/ig);
alert(has.join('\n\n'));


Рега вроде последняя, какую нашёл.

P. S. Но в принципе, это подлая ссылка. На моей памяти ещё ни одна рега её не заматчила нормально.

devote 04.12.2011 08:31

Цитата:

P. S. Но в принципе, это подлая ссылка. На моей памяти ещё ни одна рега её не заматчила нормально.
var a = 'http://votrube.ru/uploads/posts/2011-12/1322827006_-(www.votrube.ru)2.jpg'.  
match( /(?:^|[\s]+)((http(s)?:\/\/)|(www\.))([^.,]+)\.(?:[^\s,]+)/ig );  
alert(a);

trikadin 04.12.2011 10:50

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

var a = 'http://yandex.ru-хорошая ссылка'. 
match( /(?:^|[\s]+)((http(s)?:\/\/)|(www\.))([^.,]+)\.(?:[^\s,]+)/ig ); 
alert(a);


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