Далее на странице...
Эта заметка посвящена созданию регулярного выражения для поиска имени сайта в строке.
Здесь можно узнать много нового о составлении регулярных выражений и закрепить материал из предыдущих заметок.
Допустим, есть переменная, содержащая несколько названий сайтов.
var index = "У меня есть 5 сайтов: www.mysite.ru, www.mysite.com, http://my-site.ru, https://my-site-2pc.ru и Mysite.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>
Поиск сайта в строке - Пример №4 - Квантор {n,} (n или больше)
mysite.ru
my-site.ru
my-site-2pc.ru
Mysite.RU
В результате мы увидим названия сайтов, то есть все символы, которые расположены перед зоной .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>
Поиск сайта в строке - Пример №5 - www
www.mysite.ru
В результате мы видим лишь сайт с 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>
Поиск сайта в строке - Пример №6 - www и http:// - Квантор ? - 0 или 1
www.mysite.ru
http://my-site.ru
https://my-site-2pc.ru
Mysite.RU
И в последнем примере, который будет рассмотрен в рамках этой заметки, будет сокращено общее регулярное выражение за счет использования для обоих протоколов 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>
Поиск сайта в строке - Пример №7 - www и http:// - Квантор ? - 0 или 1
www.mysite.ru
http://my-site.ru
https://my-site-2pc.ru
Mysite.RU
Итак, в этой заметке было составлено достаточно длинное регулярное выражение для поиска сайтов в строке.
(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 и экранируем точку.