Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Регулярка, удалить www из адреса (https://javascript.ru/forum/misc/26905-regulyarka-udalit-www-iz-adresa.html)

Magneto 27.03.2012 03:15

Регулярка, удалить www из адреса
 
Из веб-адресов нужно удалить www которые иногда идут впереди, при этом не сломать сам адрес, тоесть:

www.site.com -> site.com
www.sitewww.com -> sitewww.com
www.ru - > www.ru
org.ua -> org.ua

у меня не выходит.

with-love-from-siberia 27.03.2012 04:10

/www\.(?=\w+(\.\w+)+$)/

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

trikadin 27.03.2012 08:44

Magneto, рискну предложить свой вариант (хоть и не ручаюсь за него после бессонной ночи). По сути, www идёт либо в самом начале (если протокол не указан), либо после двух слешей. Чтобы не сломать адрес, который идёт потом, надо задуматься о количестве точек до пути на сервере (от которого host-имя отделено слешем). Если там только одна точка, то www - это название сайта, если больше - это ненужный нам архаизм.

function replace_www(str) {
 return str.replace(/(?:((?:\/\/)|^)www\.)(?=[^/]*?\.)/i, "$1");
}
alert(replace_www("www.site.com"));
alert(replace_www("www.sitewww.com"))
alert(replace_www("www.ru"));
alert(replace_www("http://yandex.ru"));


Если же вам (вероятнее всего :D) нужна замена в строке всех ссылок, то как-то так:

function replace_www(str) {
 return str.replace(/(?:((?:(?:\/\/)|^)|\s)www\.)(?=[^/\s$]*?\.)/gi, "$1");
};
str= "www.org.ua, www.ru, www.ru/savva.ss, www.sitewww.ru, http://www.yandex.ru";
alert(replace_www(str));


Мой вариант не идеален, но что-то он может...

monolithed 27.03.2012 11:03

А это уже на катит?

var url = window.location;
url.host + url.pathname;

trikadin 27.03.2012 11:05

monolithed, мм... А причём тут это?

monolithed 27.03.2012 13:25

Цитата:

Сообщение от trikadin
мм... А причём тут это?

Ну как, если Magneto получает адрес из Location, то это самый верный вариант, если же строку, то тогда мимо.

with-love-from-siberia 27.03.2012 14:07

monolithed,
Как твое предложение в целом, вне зависимости от источника строки, помогает в решении проблемы - удалить ведущий префикс в www.example.com, но оставить в www.ru?

trikadin 27.03.2012 15:15

Цитата:

Сообщение от monolithed
Ну как, если Magneto получает адрес из Location, то это самый верный вариант, если же строку, то тогда мимо.

Да, я понимаю. Просто ему, судя по посту, нужно удалять это из многих разных ссылок... Поэтому регулярки.

nerv_ 27.03.2012 15:56

Сразу не заметил www.ru :)
var re = /^w{3}\.(?=[^.]+\.)/;

alert( 'www.site.com'.replace( re, '' ) );		// site.com
alert( 'www.sitewww.com'.replace( re, '' ) );	// sitewww.com
alert( 'www.ru'.replace( re, '' ) );			// [url]www.ru[/url]
alert( 'org.ua'.replace( re, '' ) );			// org.ua

Magneto 27.03.2012 16:52

Цитата:

Сообщение от monolithed
Ну как, если Magneto получает адрес из Location, то это самый верный вариант, если же строку, то тогда мимо.

Я получаю адрес как строку.

Теперь, пожалуйста, помогите распарсить html-страницу.
Имеется обычная html-страница, я ее получаю через ajax. В этой странице между тегами <title></title> находится нужное мне число, нужно вытащить это число. Пример страницы:
<!-- Здесь начало страницы-->

<title>
(url:www.rambler.ru/* | url:rambler.ru /* | url:rambler.ru | url:www.rambler.ru) -
Яндекс:
нашёлся 1231&nbsp;ответ
</title>

<!-- И дальше конец страницы -->


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

nerv_ 27.03.2012 17:25

Magneto, сплошные если:
1. если я Вас правильно понял
2. если кроме этого числа в данной строке чисел нет
3. если оно целое
var page = '<!-- Здесь начало страницы-->\
			\
			<title>\
			(url:[url]www.rambler.ru/*[/url] | url:rambler.ru /* | url:rambler.ru | url:[url]www.rambler.ru[/url]) -\
			Яндекс:\
			нашёлся 1231&nbsp;ответ\
			</title>\
			\
			<!-- И дальше конец страницы -->';

var re = /<title>[\S\s]*?(\d+)[\S\s]*?<\/title>/im;

alert( re.exec( page )[ 1 ] );

Но, если имеется перевод строк, проще найти <title>, затем бить по ним и искать от конца к началу (если в строе имеются еще числа).

Rootpassword 27.03.2012 17:27

var e='<title>(url:[url]www.rambler.ru/*[/url] | url:rambler.ru /* | url:rambler.ru | url:[url]www.rambler.ru[/url]) -Яндекс:нашёлся 1231&nbsp;ответ</title>';
var reg_exp=/<title>(?:.*)\s(\d+)(?:.*)<\/title>/im;
var match=e.match(reg_exp);
if(match){alert(match[1]);}else{alert('нету');}

Magneto 27.03.2012 17:52

Цитата:

Сообщение от Maxmaxmахimus
вдруг чисел будет много а тебе нужно именно то, что после "нашелся"

Но если там будет число 1345, то предложение будет иметь следующий вид: Яндекс:нашлось 1345&nbsp;ответов

Magneto 27.03.2012 17:53

Цитата:

Сообщение от nerv_
Magneto, сплошные если:
1. если я Вас правильно понял
2. если кроме этого числа в данной строке чисел нет
3. если оно целое

Это всегда целое число, и числа могут попадаться в круглых скобках в которых перечисленны сайты. тоесть типа:
<!-- Здесь начало страницы-->

<title>
(url:www.12244rambler.ru/* | url:ra335435mbler.ru /* | url:666.ru | url:www.rambler788.ru) -
Яндекс:
нашёлся 1231&nbsp;ответ
</title>

<!-- И дальше конец страницы -->

Magneto 27.03.2012 18:17

Цитата:

Сообщение от Maxmaxmахimus
выучи уже регулярки, у меня 4 часа на это ушло могу рассказать секрет

Так говори, так сказать: По секрету всему свету.

nerv_ 27.03.2012 18:51

var page = '<!-- Здесь начало страницы-->\
			\
			<title>\
			(url:[url]www.12244rambler.ru/*[/url] | url:ra335435mbler.ru /* | url:666.ru | url:[url]www.rambler788.ru[/url]) -\
			Яндекс:\
			нашёлся 1231&nbsp;ответ\
			</title>\
			\
			<!-- И дальше конец страницы -->';

var temp = /<title>[\S\s]+?<\/title>/im.exec( page )[ 0 ];

alert( /\d+(?=\D+$)/.exec( temp )[ 0 ] );

Maxmaxmахimus, хватит обманывать человека) Никакого секрета нет. Главное логику понять :)

Я уже говорил и повторюсь:
1. Регулярные выражения - прочитать и добавить в закладки. Как только потребуется шаблон составить, открываете и смотрите по таблице.
2. Особенности регулярных выражений в Javascript - прочитать и попытаться понять.
3. После первых двух пунктов уже можно что-то делать. Для полного понимания происходящего Дж.Фридл - Регулярные выражения первые 6-ть глав.

x15nicky 27.03.2012 20:26

регулярки хороши универсальностью, но плохи ясностью a в этом случае еще и скоростью работы. думаю, такой вариант меня бы устроил:
function strip_www(dom)
{
  if (dom.substr(0,4)=='www.')
    return dom.substr(4,dom.length);
  else
  return dom;
}

9xakep 27.03.2012 20:37

Цитата:

Сообщение от Magneto (Сообщение 165206)
Я получаю адрес как строку.

Теперь, пожалуйста, помогите распарсить html-страницу.
Имеется обычная html-страница, я ее получаю через ajax. В этой странице между тегами <title></title> находится нужное мне число, нужно вытащить это число. Пример страницы:
<!-- Здесь начало страницы-->

<title>
(url:www.rambler.ru/* | url:rambler.ru /* | url:rambler.ru | url:www.rambler.ru) -
Яндекс:
нашёлся 1231&nbsp;ответ
</title>

<!-- И дальше конец страницы -->


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

Если в этой строке будут только одно число, то не легче:
<title>
(url:www.rambler.ru/* | url:rambler.ru /* | url:rambler.ru | url:www.rambler.ru) -
Яндекс:
нашёлся 1231&nbsp;ответ
</title>
<script>
var a = document.getElementsByTagName('title')[0].innerHTML
a = a.match(/(\d+)/)[0]
alert(a)
</script>


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