По сути, я хотел бы проверить действительный URL-адрес, на котором нет поддомена. Кажется, я не могу понять правильное регулярное выражение для него.
Пример URL-адресов, которые ДОЛЖНЫ совпадать:
Пример URL-адресов, которые НЕ ДОЛЖНЫ совпадать:
Здесь мы начнем с выражения, которое ограничено справа с помощью .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.
Я надеялся, что есть способ сделать его более гибким, чтобы мне не приходилось перенастраивать каждый раз, когда мы вводим новый TLD, хотя я не вижу, чтобы это происходило довольно часто.
Как бы вы отловили другие домены верхнего уровня, отличные от .com? Я пробовал
^(https?://)?(www\.)?([^.]+)(\.[^.]+)(.+|)$
, но это просто соответствовало всему.