Как насчет этого?
(https?:\/\/[a-z0-9]+(?:[\-\.]{1}[a-z0-9]+)*\.[a-z]{2,6})(?=https?)(\S+)
Мы будем использовать флаг i
для поиска без учета регистра.
Протестируйте его здесь: https://regex101.com/r/J62XZq/2
Пояснение
https?:\/\/
предназначено для поиска http: // или https: //
[a-z0-9]+(?:[\-\.]{1}[a-z0-9]+)*\.[a-z]{2,6}
- поиск действительного доменного имени. Я не проверял, действительно ли это было полностью пуленепробиваемым. Но, похоже, неплохо. Мы могли бы найти официальное регулярное выражение для проверки доменных имен. Группа (?:)
- это группа без захвата (если она нам не нужна).
(https?:\/\/[a-z0-9]+(?:[\-\.]{1}[a-z0-9]+)*\.[a-z]{2,6})
оба вместе и включены в группу, так что у нас есть оригинал URL.
(?=https?)
- это позитивный прогноз, поэтому перед доменом должны следовать http или https. Возможно, вам придется адаптировать его, если у вас есть ftp или другие протоколы.
(\S+)
предназначен для сопоставления непробельных символов один или несколько раз и захвата его в группе (для дальнейшего использования и обработка. Эта вторая группа должна быть обработана, чтобы избавиться от второй строки запроса ?param=x&option
, которая, вероятно, принадлежит окружающему URL.
Редактировать
Поскольку у нас была дискуссия о сопоставлении только правильных, это означает, что мой ответ не очень хороший. Не всегда легко понять, что нужно сделать.
https://regex101.com/r/J62XZq/7
Здесь мы ищем URL с доменом, за которым не следует http:
или https:
.
Хитрость заключается в добавлении \b
в начале, чтобы избежать сопоставление URL-адреса внутри URL-адреса и использование отрицательного просмотра после домена.
\bhttps?:\/\/[a-z0-9]+(?:[\-\.]{1}[a-z0-9]+)*\.[a-z]{2,6}(?!https?:)\/\S+\/next\?(\S+)
Отрицательный просмотр выполняется с помощью (?!https?:)
(я не добавил двойной sla sh, так как я предполагаю, что это достаточно).
Последняя часть с /next
может не это необходимо. Это зависит от того, хотите ли вы точно сопоставить URL-адрес с внутренним или нет.