«Единственный способ творить великие дела – это любить то, что ты делаешь»
JavaScript
site.komp36.ru Создание сайтов. Твой сайт фотографа Что есть на сайте? Несколько фото галерей: свадебная, постановочная съемка, love story, детские фото. Договор на фотосъемку, прайс-лист.
site.komp36.ru Продающий лендинг «Установка и продажа окон» Установка и продажа окон, установка дверей, перегородок. Одностраничный продающий сайт. Заявки прямо с сайта
site.komp36.ru Универсальный лендинг. Любая тема сайта - 4900 руб. Лендинг адаптируется под любую тему: ремонт, отделка, продажа окон, дверей, лестниц, мебели и многое другое
site.komp36.ru Создание сайтов. Сайт сервисного центра. Сайт компании. Новости и отзывы. Несколько прайс-листов – под каждый отдельная страница. Возможность размещения статей


Игра «Морской Бой» на JavaScript: Простая Игра и Игра для Двоих



Эта заметка посвящена созданию регулярного выражения для поиска имени сайта в строке.

Здесь можно узнать много нового о составлении регулярных выражений и закрепить материал из предыдущих заметок.

Допустим, есть переменная, содержащая несколько названий сайтов.

var index = "У меня есть 5 сайтов: www.mysite.ru, www.mysite.com, http://my-site.ru, https://my-site-2pc.ru и Mysite.RU. Мне нужны только те, что в зоне .ru";

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


Точка в регулярных выражениях экранируется

Решение текущей задачи следует начать с того, чтобы составить регулярное выражение для зоны .ru

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

Фрагмент кода

<script type="text/javascript">

var index = "У меня есть 5 сайтов: www.mysite.ru, www.mysite.com, http://my-site.ru, https://my-site-2pc.ru и Mysite.RU. Мне нужны только те, что в зоне .ru";
var regular = /\.ru/g; /* Экранируем точку + добавляем глобальный поиск g */
var result = index.match(regular); /* Ищем в строке все зоны .ru */

for(i = 0; i < result.length; i++) /* Выводим элементы массива result на экран при помощи цикла for */
{
document.write(result[i] + "<p>");
}

</script>

Результат

Итак, пока что найдены и выведены на экран все зоны .ru кроме .RU, то есть кроме зоны записанной заглавными (прописными) буквами. Кроме этого последняя из них не относится к названию сайта (она просто расположена в конце строки и со временем будет исключена). Но сначала рассмотрим, как вывести зону с прописными буквами .RU.

Регистронезависимый шаблон i

Чтобы вывести недостающую зону .RU, снова обратимся к шпаргалке по регулярным выражениям - к группе «Модификаторы шаблонов». И воспользуемся регистронезависимым шаблоном i, благодаря которому игнорируется регистр букв.

Фрагмент кода

<script type="text/javascript">

var index = "У меня есть 5 сайтов: www.mysite.ru, www.mysite.com, http://my-site.ru, https://my-site-2pc.ru и Mysite.RU. Мне нужны только те, что в зоне .ru";
var regular = /\.ru/gi; /* Экранируем точку + добавляем глобальный поиск g + игнорируем регистр i */
var result = index.match(regular); /* Ищем в строке все зоны .ru */

for(i = 0; i < result.length; i++) /* Выводим элементы массива result на экран при помощи цикла for */
{
document.write(result[i] + "<p>");
}

</script>

Результат

Теперь, при помощи регистронезависимого шаблона i найдены и выведены на экран все зоны .ru в том числе зона с прописным регистром букв .RU.

Диапазон [abc] (a или b или c)

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

Чтобы на него ответить, нужно знать, что в составе доменного имени могут быть только латинские буквы, цифры или дефис.

Имена доменов на кириллице сейчас учитываться не будут.

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

Снова обратимся к шпаргалке по регулярным выражениям - к группе «Диапазоны».

  • В первую очередь нас интересует диапазон [abc] (a или b или c). А в нашем случае [a-z], то есть любая латинская буква.

  • Указывая на цифру в имени сайта можно воспользоваться уже знакомым регулярным выражением \d, которое обозначает любую цифру.

    Либо дополнительно к диапазону латинских букв, добавить диапазон цифр от 0 до 9. То есть в итоге указать диапазон [a-z0-9].

  • И, наконец, в общий диапазон латинских букв и цифр можно добавить дефис
    [a-z0-9-].

Вернемся к нашему примеру и дополним регулярное выражение.

Фрагмент кода

<script type="text/javascript">

var index = "У меня есть 5 сайтов: www.mysite.ru, www.mysite.com, http://my-site.ru, https://my-site-2pc.ru и Mysite.RU. Мне нужны только те, что в зоне .ru";
var regular = /[a-z0-9-]\.ru/gi; /* Диапазон из букв, цифр и тире. Экранируем точку + добавляем глобальный поиск g + игнорируем регистр i */
var result = index.match(regular); /* Ищем шаблон в строке */

for(i = 0; i < result.length; i++) /* Выводим элементы массива result на экран при помощи цикла for */
{
document.write(result[i] + "<p>");
}

</script>

Результат

В результате вместе с зоной .ru на экран выведен лишь первый символ, который стоит перед ней и который попадает в диапазон [a-z0-9-]. Как вывести остальные?

Квантор {n,} (n или больше)

Итак, как дополнить регулярное выражение [a-z0-9-]\.ru, чтобы при поиске сайта в строке вывести на экран все символы из диапазона [a-z0-9-], расположенные перед зоной .ru?

Здесь помогут «Кванторы» из шпаргалки по регулярным выражениям.

Зная о том, что в имени домена, перед зоной .ru должно быть хотя бы 2 символа, воспользуемся квантором {2,}, который означает «2 или больше».

Может иметь место такой квантор {n,m} - с двумя параметрами, например, {2,100}. В этом случае он будет учитывать диапазон от 2 до 100 символов.

Возвращаемся к предыдущему примеру и дополняем в нем регулярное выражение.

Фрагмент кода

<script type="text/javascript">

var index = "У меня есть 5 сайтов: www.mysite.ru, www.mysite.com, http://my-site.ru, https://my-site-2pc.ru и Mysite.RU. Мне нужны только те, что в зоне .ru";
var regular = /[a-z0-9-]{2,}\.ru/gi; /* Диапазон из букв, цифр и тире в количестве от 2 и более символов... Экранируем точку + добавляем глобальный поиск g + игнорируем регистр i */
var result = index.match(regular); /* Ищем шаблон в строке */

for(i = 0; i < result.length; i++) /* Выводим элементы массива result на экран при помощи цикла for */
{
document.write(result[i] + "<p>");
}

</script>

Результат

В результате мы увидим названия сайтов, то есть все символы, которые расположены перед зоной .ru были учтены, за исключением протоколов http:// и https://, а также не хватает префикса www и точки после www. Идем далее.

Ищем www. и http:// - Квантор ? - 0 или 1

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

Казалось бы здесь все просто. Зная о том, что точка в регулярных выражениях экранируется, нужно всего лишь к общему выражению добавить следующую запись: www\.

Фрагмент кода

<script type="text/javascript">

var index = "У меня есть 5 сайтов: www.mysite.ru, www.mysite.com, http://my-site.ru, https://my-site-2pc.ru и Mysite.RU. Мне нужны только те, что в зоне .ru";
var regular = /www\.[a-z0-9-]{2,}\.ru/gi; /* www. + Диапазон из букв, цифр и тире в количестве от 2 и более символов... Экранируем точку + добавляем глобальный поиск g + игнорируем регистр i */
var result = index.match(regular); /* Ищем шаблон в строке */

for(i = 0; i < result.length; i++) /* Выводим элементы массива result на экран при помощи цикла for */
{
document.write(result[i] + "<p>");
}

</script>

Результат

В результате мы видим лишь сайт с www., так как регулярное выражение www\.[a-z0-9-]{2,}\.ru подразумевает, что www. является обязательным элементом шаблона, по которому осуществляется поиск.

Но как видно из исходной переменной index, префикс www. вместе с точкой вовсе не являются обязательными символами в доменном имени сайта. И, кроме этого, они не должны повторяться более одного раза. Учитывая это, выражение www\. следует дополнить.

Для этого снова обратимся к шпаргалке по регулярным выражениям, откуда на этот раз возьмем квантор ?, который означает «0 или 1». В нашем случае 0 будет говорить о том, что www. не является обязательным элементом шаблона (т.е. этих символов может и не быть), а 1 - что если www. и встречается в доменном имени сайта, то лишь один раз.

В итоге мы получим следующее: (www\.)?.

То же самое относится и к протоколам http:// и https:// - к ним также следует применить квантор ?. Не забываем экранировать слэши.

Записи для протоколов будут такими: (http:\/\/)? и (https:\/\/)?. Смотрим пример ниже.

Фрагмент кода

<script type="text/javascript">

var index = "У меня есть 5 сайтов: www.mysite.ru, www.mysite.com, http://my-site.ru, https://my-site-2pc.ru и Mysite.RU. Мне нужны только те, что в зоне .ru";
var regular = /(https:\/\/)?(http:\/\/)?(www\.)?[a-z0-9-]{2,}\.ru/gi; /* Протоколы и www. если и встречаются, то лишь 1 раз + Диапазон из букв, цифр и тире в количестве от 2 и более символов... Экранируем точку + добавляем глобальный поиск g + игнорируем регистр i */
var result = index.match(regular); /* Ищем шаблон в строке */

for(i = 0; i < result.length; i++) /* Выводим элементы массива result на экран при помощи цикла for */
{
document.write(result[i] + "<p>");
}

</script>

Результат

И в последнем примере, который будет рассмотрен в рамках этой заметки, будет сокращено общее регулярное выражение за счет использования для обоих протоколов http:// и https:// одной записи:

Вместо (http:\/\/)? и (https:\/\/)? запись будет следующей: (https?:\/\/)?

Отдельно для буквы s действует квантор ?. Смотрим пример.

Фрагмент кода

<script type="text/javascript">

var index = "У меня есть 5 сайтов: www.mysite.ru, www.mysite.com, http://my-site.ru, https://my-site-2pc.ru и Mysite.RU. Мне нужны только те, что в зоне .ru";
var regular = /(https?:\/\/)?(www\.)?[a-z0-9-]{2,}\.ru/gi; /* Протоколы и www. если и встречаются, то лишь 1 раз + Диапазон из букв, цифр и тире в количестве от 2 и более символов... Экранируем точку + добавляем глобальный поиск g + игнорируем регистр i */
var result = index.match(regular); /* Ищем шаблон в строке */

for(i = 0; i < result.length; i++) /* Выводим элементы массива result на экран при помощи цикла for */
{
document.write(result[i] + "<p>");
}

</script>

Результат

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

(https?:\/\/)?(www\.)?[a-z0-9-]{2,}\.ru

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

Давайте еще раз коротко его опишем:

  • (https?:\/\/)? - это часть шаблона ищет в строке http:// или https://. Первый квантор ? применим к букве s, второй квантор ? говорит о том, что протокола http:// или https:// может и не быть, а если он есть, то встречается один раз.

    Оба слэша здесь экранируются обратным слэшем.

  • (www\.)? - эта часть шаблона ищет в строке www. И снова используется квантор ?

    При этом точка экранируется обратным слэшем.

  • [a-z0-9-]{2,} - здесь осуществляется поиск диапазона из латинских букв, цифр, среди которых может быть и дефис [a-z0-9-]. А запись {2,} говорит о том, что этих символов должно быть как минимум два или больше.

    В имени сайта может встретиться и под домен. Например, вот так: www.subdomain.mysite.ru. Тогда к диапазону [a-z0-9-] нужно будет добавить точку, при этом не забываем ее экранировать. Вот так: [a-z0-9-\.].

  • \.ru - наконец, мы ищем зону .ru и экранируем точку.

Читайте также...

site.komp36.ruТвой сайт фотографа. Создание сайтов Что есть на сайте? Несколько фото галерей: свадебная, постановочная съемка, love story, детские фото. Договор на фотосъемку, прайс-лист.
site.komp36.ru Акция Как начать свое дело? Свой сайт «Укладка плитки» 9 000 руб. Лендинг адаптируется под любой вид отделочных работ, продажу товаров или услуг. Сайт поможет найти новых клиентов
site.komp36.ru Акция Продающий лендинг «Установка и продажа окон» 9 000 руб. Одностраничный продающий сайт. Установка и продажа окон, установка дверей, перегородок. Заявки прямо с сайта

Отзывы и комментарии:

Комментариев нет...

Оставить отзыв:

Ваше Имя:

Текст комментария:

Ответьте на вопрос:

Сколько дней в Високосном году?


Объект String
Поиск сайта в строке
11470
Свойство length - Число символов в строке
11470
Практическая задача - Свойство length
11470
Регистр строки - toUpperCase и toLowerCase
11470
Практическая задача - Методы toUpperCase и toLowerCase
11470
Поиск совпадений в строке - Методы indexOf и lastIndexOf
11470
Практическая задача - Методы indexOf и lastIndexOf
11470
Метод slice - Копирование из строки
11470
Практическая задача - Метод slice
11470
Методы charAt и charCodeAt - Возвращаем символ и КОД символа
11470
Практическая задача - Методы charAt и charCodeAt
11470
Метод search - Регулярные выражения
11470
Регулярные выражения - Начало и Конец строки
11470
Практическая задача - Регулярные выражения
11470
Метод match - Возвращает массив из совпадений - Глобальный поиск g
11470
Практическая задача с кредитной картой
11470
Метод replace - Замена совпадений
11470
Практическая задача - Метод replace
11470
Метод trim в - Удаление пробелов в начале и конце строки
11470
Метод substring - Извлекает часть строки
11470
Метод split в JavaScript - Разделитель строки
11470
Тематические публикации
site.komp36.ru Как начать свое дело? Свой сайт «Укладка плитки» 9 000 руб. Лендинг адаптируется под любой вид отделочных работ, продажу товаров или услуг. Сайт поможет найти новых клиентов
site.komp36.ru Продающий лендинг «Установка и продажа окон» 9 000 руб. Одностраничный продающий сайт. Установка и продажа окон, установка дверей, перегородок. Заявки прямо с сайта
Популярные заметки
Последние заметки