Что нового

[RegExp] Маска для адреса URL

Propert

Новичок
Сообщения
8
Репутация
0
Добрый день. Помогите пожалуйста.
Есть задача - исключить возможность неправильного написания адреса URL (по крайней мере в доменной его части). Не нужно ничего захватывать. На выходе надо получить либо True либо False. Шаблон придумал как мог.(не специалист). Как исключить попадание в шаблон записей вида http://aaa..bbb.ccc или http://aaa--aaa.bbb.ccc ? (если можно, с кратким комментарием). Спасибо.

Код:
$URL = "http://aaa.bbb.ccc"
$Pattern = "^https?://[[:alpha:].-]+\.[[:alpha:]]{2,4}(?(?=:).\d{2,4})(?(?=/)\S*)$"
$a = StringRegExp ($URL, $Pattern)
MsgBox (0,"",$a)
 

edyapd

Осваивающий
Сообщения
380
Репутация
30
Насколько я понял, второй пример вполне валидный. Даже в тексте он выделяется как ссылка.
А так, вот попробуйте
Код:
$url = "http://aaa--aaa.bbb.ccc"
$a = StringRegExp($url, "(?i)^http(s)?://[a-z0-9-]+(.[a-z0-9-]+)*(:[0-9]+)?(/.*)?$")
ConsoleWrite($a & @LF)

Есть ещё пример из справки
Код:
Найти (?si)(?:.*?)?(https?://[\w.:]+/?(?:[\w/?&=.~;\-+!*_#%])*) - найти ссылки
Но его не пробовал
 
Автор
P

Propert

Новичок
Сообщения
8
Репутация
0
edyapd сказал(а):
Насколько я понял, второй пример вполне валидный. Даже в тексте он выделяется как ссылка.
А так, вот попробуйте
Код:
$url = "http://aaa--aaa.bbb.ccc"
$a = StringRegExp($url, "(?i)^http(s)?://[a-z0-9-]+(.[a-z0-9-]+)*(:[0-9]+)?(/.*)?$")
ConsoleWrite($a & @LF)
Спасибо за ответ, но данный шаблон не исключает: "--", домен верхнего уровня из одной буквы, порт из одной цифры, порт из букв.
В примере из справки примерно то же самое.
В моем случае http://aaa--aaa.bbb.ccc" - не валидный адрес.
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Код:
$url = "http://aaa--aaa.bbb.ccc"
$pattern = "(?i)^http(s)?://.*?(:?--|\.\.).*?$"
$a = 1-StringRegExp($url, $pattern)
ConsoleWrite($a & @LF)
 
Автор
P

Propert

Новичок
Сообщения
8
Репутация
0
C2H5OH сказал(а):
Код:
$url = "http://aaa--aaa.bbb.ccc"
$pattern = "(?i)^http(s)?://.*?(:?--|\.\.).*?$"
$a = 1-StringRegExp($url, $pattern)
ConsoleWrite($a & @LF)
Спасибо за ответ. Не подходит. Позволяет вводить не валидные адреса.
Может быть я неверно задал вопрос. Конкретизирую: как исключить попадание в шаблон записей вида http://aaa..bbb.ccc или http://aaa--aaa.bbb.ccc, при соблюдении условий уже описанных в шаблоне?
 

edyapd

Осваивающий
Сообщения
380
Репутация
30
Если верить интернету, то для проверки валидности создаются целые библиотеки. А вы хотите запихнуть это в одну строку. Вы хотя бы для примера напишите адреса, которые считаете неправильными. Но чтобы потом не было "а вот ещё не вырезает вот этот"
 
Автор
P

Propert

Новичок
Сообщения
8
Репутация
0
C2H5OH

Примеры неправильных адресов(a,b,c - любые буквы латинского алфавита): http://aaa--aaa.bbb.ccc, http://aaa..bbb.ccc, http://aaa.bbb.c, http://aaa.bbb.cccccc, http://aaa.bbb.ccc:8, http://aaa.bbb.ccc:80808080, http://aaa.bbb.ccc:dd/(имеется ввиду в номере порта буквы а не цифры).
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Я что ли буду разбираться почему каждый из этих адресов неправильный?
Как задача поставлена, такой и будет ответ

Код:
$pattern = "(?i)(?(DEFINE)(?<incorrect>^.*?(:?--|\.\.)))(?(?=(?&incorrect))(*FAIL)|^http(s)?://[[:alpha:].-]+\.[[:alpha:]]{2,4}(?(?=:).\d{2,4})(?(?=/)\S*)$)"
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Propert [?]
На выходе надо получить либо True либо False
Код:
$sURL = "http://autoit-script.ru"
$iValid = StringRegExp($sURL, "^(http[s]?:\/\/){0,1}(www\.){0,1}[a-zA-Z0-9\.\-]+\.[a-zA-Z]{2,5}[\.]{0,1}", 0)
If $iValid Then
   MsgBox(64, "", $iValid = True)
Else
   MsgBox(16, "", $iValid = True)
EndIf
 
Автор
P

Propert

Новичок
Сообщения
8
Репутация
0
Garrett
Спасибо, к сожалению не работает как надо.

C2H5OH
Спасибо большое. Все работает. :smile:
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
И тишина...
Я не понимаю! Мне наконец-то удалось проверь не вхождение шаблона в поиск путем применения конструкции
(?(шаблон_исключение)(*FAIL)|шаблон_соответствия)
И что, даже оценить некому?
Не, ну, может для вас это и ерунда, может вы такие шаблоны десятками каждый день пишете...
А у меня просто праздник какой-то!
:dance1: :dance2: :dance3:
 
Автор
P

Propert

Новичок
Сообщения
8
Репутация
0
Немного упростил (как мне кажется)
Код:
$Pattern = "(?(?=(.*?[\.-]{2,}))(*FAIL)|https?://[[:alpha:]]+[[:alpha:].-]+\.[[:alpha:]]{2,4}(?(?=:).\d{2,4})(?(?=/)[^\s\.,]*)$)"


:-\
 
Верх