RegEx для сбойных субдоменов

По сути, я хотел бы проверить действительный URL-адрес, на котором нет поддомена. Кажется, я не могу понять правильное регулярное выражение для него.

Пример URL-адресов, которые ДОЛЖНЫ совпадать:

  • пример.com
  • www.example.com
  • Например.co.uk
  • пример.com/страница
  • пример.com?ключ=значение

Пример URL-адресов, которые НЕ ДОЛЖНЫ совпадать:

  • test.example.com
  • sub.test.example.com
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
0
31
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Здесь мы начнем с выражения, которое ограничено справа с помощью .com или .co.uk и других, если это необходимо, затем мы проведем влево, чтобы собрать все неточечные символы, добавим необязательные www и https, затем мы добавим start char ^, что приведет к сбою всех субдоменов:

^(https?://)?(www\.)?([^.]+)(\.com|\.co\.uk)(.+|)$

В эту группу захвата можно добавить другие TLD:

(\.com|\.co\.uk|\.net|\.org|\.business|\.edu|\.careers|\.coffee|\.college)

И выражение можно изменить на:

^(https?://)?(www\.)?([^.]+)(\.com|\.co\.uk|\.net|\.org|\.business|\.edu|\.careers|\.coffee|\.college)(.+|)$

Гибкость

Я не могу придумать что-то, чтобы сделать TLD слишком гибкими, так как это выражение проверки. Например, если бы мы упростили его до:

^(https?://)?(www\.)?([^.]+)(\.[a-z]+)(\.uk?)?[a-z?=/]+$

это может работать для URL-адресов, перечисленных в вопросе, но также будет проходить:

example.example

что недействительно. Мы можем использовать только это выражение:

^(https?://)?(www\.)?([^.]+)(\.[a-z]+)(\.uk?)?[a-z?=/]+$

если бы мы знали, что то, что мы передаем, это уже URL.

НЕ ФУНКЦИОНАЛЬНАЯ ДЕМО

Демо

Этот фрагмент просто показывает, как работают группы захвата:

const regex = /^(https?://)?(www\.)?([^.]+)(\.com|\.co\.uk)(.+|)$/gm;
const str = `example.com
www.example.com
example.co.uk
example.com/page
example.com?key=value

test.example.com
sub.test.example.com`;
let m;

while ((m = regex.exec(str)) !== null) {
    // This is necessary to avoid infinite loops with zero-width matches
    if (m.index === regex.lastIndex) {
        regex.lastIndex++;
    }
    
    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
        console.info(`Found match, group ${groupIndex}: ${match}`);
    });
}

Цепь регулярных выражений

jex.im визуализирует регулярные выражения:

регулярное выражение

Если это выражение не нужно, его можно модифицировать/изменить в regex101.com.

ДЕМО

Как бы вы отловили другие домены верхнего уровня, отличные от .com? Я пробовал ^(https?://)?(www\.)?([^.]+)(\.[^.]+)(.+|)$, но это просто соответствовало всему.

franco 30.05.2019 05:44

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

franco 30.05.2019 05:51

Другие вопросы по теме