Как принять номер порта в этом регулярном выражении?

Это регулярное выражение проверки URL

/^(https?://)?([\da-z\.-]+)\.([a-z\.]{2,6})([/\w \.-]*)*/?$/

Это работает Однако, если я ввожу URL-адрес с номером порта, например http://localhost:3000, возникает ошибка.

Как я могу изменить это выражение, чтобы оно также принимало номер порта?

Я не думаю, что в оригинальном регулярном выражении есть что-то специфичное для PHP. Он должен работать как есть.

Barmar 17.04.2023 07:06

Как вы думаете, почему http само по себе должно совпадать? Если вы хотите сопоставить URL-адрес, вам нужно больше, чем просто имя протокола.

Barmar 17.04.2023 07:08

Можете ли вы опубликовать точный код PHP, который печатает true для "http"? На первый взгляд, . в этом регулярном выражении является обязательным символом.

Dogbert 17.04.2023 07:08

Вам не нужно убегать . внутрь [] на любом языке.

Barmar 17.04.2023 07:10

Но вам нужно сбежать / внутрь [].

Barmar 17.04.2023 07:11

Можете ли вы привести примеры URL-адресов, которые вы хотите проверить?

nice_dev 17.04.2023 07:17

@Barmar не https? делает 's' необязательным?

GoonGamja 17.04.2023 07:19

@nice_dev, например «localhost: 3000»

GoonGamja 17.04.2023 07:19

@GoonGamja Да. Но ничто не делает остальную часть URL-адреса необязательной. Это должно быть что-то вроде http://foo.bar.com/x/y/z

Barmar 17.04.2023 07:26

Ваше регулярное выражение PHP работает с JS: regex101.com/r/a4RtLl/1

Barmar 17.04.2023 07:27

Виноват! http работает нормально. проблема была в номере порта

GoonGamja 17.04.2023 07:50

@GoonGamja Не используйте регулярное выражение для проверки URL. Есть лучшие способы. См. stackoverflow.com/questions/5717093/…

nice_dev 17.04.2023 08:43

Почему это помечено JS и PHP, но не содержит такого кода?

Nico Haase 17.04.2023 08:57

@NicoHaase, когда я редактирую свой вопрос, забыл удалить тег

GoonGamja 17.04.2023 09:08
Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
14
98
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Пожалуйста, можете попробовать этот

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-тегу или пустому тегу.

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

Nico Haase 17.04.2023 08:57

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