Это регулярное выражение проверки URL
/^(https?://)?([\da-z\.-]+)\.([a-z\.]{2,6})([/\w \.-]*)*/?$/
Это работает Однако, если я ввожу URL-адрес с номером порта, например http://localhost:3000, возникает ошибка.
Как я могу изменить это выражение, чтобы оно также принимало номер порта?
Как вы думаете, почему http
само по себе должно совпадать? Если вы хотите сопоставить URL-адрес, вам нужно больше, чем просто имя протокола.
Можете ли вы опубликовать точный код PHP, который печатает true для "http"
? На первый взгляд, .
в этом регулярном выражении является обязательным символом.
Вам не нужно убегать .
внутрь []
на любом языке.
Но вам нужно сбежать /
внутрь []
.
Можете ли вы привести примеры URL-адресов, которые вы хотите проверить?
@Barmar не https? делает 's' необязательным?
@nice_dev, например «localhost: 3000»
@GoonGamja Да. Но ничто не делает остальную часть URL-адреса необязательной. Это должно быть что-то вроде http://foo.bar.com/x/y/z
Ваше регулярное выражение PHP работает с JS: regex101.com/r/a4RtLl/1
Виноват! http работает нормально. проблема была в номере порта
@GoonGamja Не используйте регулярное выражение для проверки URL. Есть лучшие способы. См. stackoverflow.com/questions/5717093/…
Почему это помечено JS и PHP, но не содержит такого кода?
@NicoHaase, когда я редактирую свой вопрос, забыл удалить тег
Пожалуйста, можете попробовать этот
https?://(?:w{1,3}\.)?[^\s.]+(?:\.[a-z]+)*(?::\d+)?(?![^<]*(?:</\w+>|/?>))
https?
: Эта часть соответствует протоколу URL. S необязателен, поэтому он соответствует как http, так и https.
://
: соответствует двоеточию и двум косым чертам, которые являются частью протокола.
(?:w{1,3}\.)?
: соответствует необязательному поддомену www, если он существует. (?:) создает группу без захвата, а квантификатор {1,3} соответствует от 1 до 3 экземпляров буквы "w".
[^\s.]+
: соответствует доменному имени, состоящему из одного или нескольких символов, не являющихся пробелами или точками.
(?:\.[a-z]+)*
: соответствует любым необязательным субдоменам, которые идут перед доменом, разделенным точками. (?:) создает еще одну незахватывающую группу, а квантификатор * соответствует нулю или более экземплярам этой группы. [a-z]+ соответствует одной или нескольким строчным буквам.
(?::\d+)?
: Соответствует необязательному номеру порта, который может идти после домена, которому предшествует двоеточие. (?:) создает еще одну незахватывающую группу, а ? квантификатор делает его необязательным. Знак : соответствует двоеточию, а \d+ соответствует одной или нескольким цифрам.
(?![^<]*(?:</\w+>|/?>))
: это отрицательный просмотр вперед, который гарантирует, что URL-адрес не является частью тега HTML. Он проверяет, нет ли перед URL-адресом символов, соответствующих шаблону (?:</\w+>|/?>)
, который соответствует любому закрывающему HTML-тегу или пустому тегу.
Пожалуйста, добавьте некоторое объяснение к вашему ответу, чтобы другие могли извлечь из него уроки. Что вы изменили и почему?
Я не думаю, что в оригинальном регулярном выражении есть что-то специфичное для PHP. Он должен работать как есть.