Javascript очень сложное регулярное выражение

12
rtyug
На сайте с 13.05.2009
Offline
263
2253

Уважаемые, есть проблема с регуляркой

задача:

ссылки вида:

<a href='http://site.ru/wert345' target='_blank' title='http://site.ru/wert345'>http://site.ru/wert345</a>

или вида:

<a href='http://site.ru' target='_blank' title='http://site.ru'>http://site.ru</a>

заменить на:

{ <a href='http://site.ru' target='_blank' title='http://site.ru'>http://site.ru</a> 

<a href='http://api.site2.ru?v=ТУТ_ДОЛЖЕН_БЫТЬ_ДОМЕН_site.ru' >~~~</a>

}

т.е. http://api.site2.ru?v=site.ru

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

 

function getd( el ) {
var returnArr = el.replace(/\b([A-Za-z0-9.-]+\. [A-Za-z]{2,6})/ig, "$1" );
// alert(el);
return returnArr;
}


test = test.replace(/<a\s.*href=['"](\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])['"].*>.*<\/a>/ig,
"\"<a href='$1' target='_blank' title='$1'>$1</a> <a href='http://api.site2.ru?v"+getd($1)+"' >~~~</a>\"" );


это вариант не рабочий, потому что я пытался вставить функция внутрь регулярного выражения getd($1)

Ошибка: ReferenceError: $1 is not defined

вариант рабочий:

 text = text.replace(/<a\s.*href=['"](\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])['"].*>.*<\/a>/ig, 
"\"<a href='$1' target='_blank' title='$1'>$1</a> <a href='http://api.site2.ru?v=$1' >~~~</a>\"" );

НО в v=$1 подставляется только вс ссылка вместо домена

Спалил тему: Pokerstars вывод WMZ, etc на VISA 0% или SWIFT + Конверт USD/GBP,etc (net profit $0,5 млрд) (https://minfin.com.ua/blogs/94589307/115366/) Monobank - 50₴ на счет при рег. тут (https://clck.ru/DLX4r) | Номер SIP АТС Москва 7(495) - 0Ꝑ, 8(800) - 800Ꝑ/0Ꝑ (http://goo.gl/XOrCSn)
siv1987
На сайте с 02.04.2009
Offline
427
#1

<a\s[^>]*href=["']([\w]+:\/\/([^\/"']+)\/?.*?)["'][^>]*>(.*?)<\/a>

$1 => http://site.ru/folder

$2 => site.ru

---------- Добавлено 26.04.2013 в 01:52 ----------

II

/<a\s[^>]*href=["']([\w]+:\/\/(.+?)(\/.*?)?)["'][^>]*>(.*?)<\/a>/

$1 => http://site.ru/folder

$2 => site.ru

$3 => /folder

rtyug
На сайте с 13.05.2009
Offline
263
#2

Спасибо большое, работает!

и для кириллических доменов, тоже

rtyug
На сайте с 13.05.2009
Offline
263
#3

подскажите пожалуйста

как написать исключение?

надо в тексте найти домены, НО надо игнорировать ссылки, т.е. домены с http:// надо игнорировать

я написал для замены:

 /(?!.?http).?([\w]+\.[\w]{2,6})/ig 

но оно захватывает ссылки, тоже

а как написать исключение чтобы ссылки с http не захыватывало, т.е. чтобы ссылки не портило, а чтобы только домен, например такое чтобы взяло supersite.ru , а http:// игнорировало

ЗЫ: хочу сделать замену

siv1987
На сайте с 02.04.2009
Offline
427
#4

/\b(?<!http:\/\/)([\w]+\.[\w]{2,6})\b/ig

rtyug
На сайте с 13.05.2009
Offline
263
#5

выдается ошибка:

Метка времени: 29.04.2013 19:31:27
Ошибка: SyntaxError: invalid quantifier
Исходный код:
html = html.replace(/\b(?<!http://)([\w]+\.[\w]{2,6})\b/ig,

я пробовал так написать http:\/\/

и другие варианты

но все равно пишет: invalid quantifier

в документации я видел так ?!, но не так ?<!

siv1987
На сайте с 02.04.2009
Offline
427
#6

Ну тогда

/(^|\s)([\w]+\.[\w]{2,6})\b/ig

rtyug
На сайте с 13.05.2009
Offline
263
#7

Спасибо большое!

работает, я сколько много читал и смотрел про регулряки на js, но такое выражение в первые вижу (^|\s)

siv1987
На сайте с 02.04.2009
Offline
427
#8
rtyug:
работает, я сколько много читал и смотрел про регулряки на js, но такое выражение в первые вижу

А что там такого невероятного? Группа - или начало строки ^ или пробел \s.

rtyug
На сайте с 13.05.2009
Offline
263
#9

как тогда в итоге получилось так что http пропускается? :)

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

siv1987
На сайте с 02.04.2009
Offline
427
#10

Там задается - или начало строки или пробел за которым следует метасимвол \w (алфавитно-цифровой шаблон) в котором http:// не попадает.

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий