Убедитесь, что указанный URL-адрес является допустимым - PullRequest
0 голосов
/ 23 марта 2020

Как можно считать следующую строку недопустимым путем URL-адреса, поскольку она фактически содержит имя хоста и не представляет допустимый путь:

/<>//google.com

Используя следующий код проверки регулярного выражения:

preg_match(""/(?:[\w-]+\.)+[\w-]+/"", $url, $matches);

В настоящее время я получаю true для обоих: /<>//google.com и /3.2/

, в то время как "/3.2/" - это git путь URL-адреса, а не имя домена

Ответы [ 2 ]

0 голосов
/ 23 марта 2020

Основываясь на ответах здесь и здесь , я придумал что-то вроде этого:

function is_valid_url_path($url_path) {
  return preg_match("#^\/*[a-z0-9+&@=~_|!:,.;-]*\/*(%[0-9]([a-f]|[0-9]]))*/*$#i", $url_path);
}

print is_valid_url_path('/3.2/'); // 1
print is_valid_url_path('//3.2/'); // 1
print is_valid_url_path('/3.2///%3F'); // 1
print is_valid_url_path('/3.2///%3'); // 0
print is_valid_url_path("/<>//google.com"); // 0

Детская площадка: https://repl.it/repls/ThoughtfulAnnualSeahorse

Вещи, которые я рассмотрел в регулярном выражении:

  • Допустимые символы: a-z A-Z 0-9 . - _ ~ ! $ & ' ( ) * + , ; = : @

  • Проценты -encoding : DIGIT + (DIGIT | (A|B|C|D|E|F)) (например, %23, %3B)

  • Путь содержит несколько пустых сегментов, например ///hello//world

  • Путь завершается либо ?, #, либо просто концом URI

Также см. RF C 3986, Se c. 3.3. Путь .

0 голосов
/ 23 марта 2020

Возможно, вы также можете использовать FILTER_VALIDATE_URL и передать флаг FILTER_FLAG_PATH_REQUIRED.

filter_var('http://host.com/path', FILTER_VALIDATE_URL, FILTER_FLAG_PATH_REQUIRED);

https://www.php.net/manual/en/filter.filters.validate.php

https://www.php.net/manual/en/intro.filter.php

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...