regex — проверяет путь URL в переполнении стека

В PHP я пытаюсь проверить путь URL с помощью регулярных выражений.
Текущее регулярное выражение, которое я протестировал, таково:
^(\/\w+)+\.\w+(\?(\w+=[\w\d]+(&\w+=[\w\d]+)+)+)*$

public function isValidPath($urlPath)
{
if (!preg_match("#^(\/\w+)+\.\w+(\?(\w+=[\w\d]+(&\w+=[\w\d]+)+)+)*$#i", $urlPath)) { return false; }
else { return true; }
}

$arrUrl = parse_url($url);
$urlPath = $arrUrl['path'];
// valid path ?
if(isValidPath($urlPath)) { echo "OK"; }
else { echo "Invalid Path URL"; }

Но это не работает с путем, который только начинается с /,

 - / -> valid path
- /aaa -> valid path
- /aaa/bbb -> valid path
- /aaa?q=x -> valid path
- aaa -> Not valid path
- /asd/asd./jsp -> Not valid path
- /asd/asd.jsp/  -> Not valid path
- /asd./asd.jsp -> Not valid path
- /asd///asd.js -> Not valid path
- /asd/asd.jsp&bar=baz?inga=42?quux -> Not valid path

Я не эксперт по регулярным выражениям, и я ломаю голову, пытаясь сделать то, что кажется очень простым.

0

Решение

Я использую подход @ cmorrissey, который на самом деле не требует регулярных выражений:

$result = filter_var('http://www.example.com' . $path, FILTER_VALIDATE_URL);

if ($result !== false) {
$result = true;
}

result затем true или же false в зависимости от правильности пути. Обратите внимание, что пути всегда должны начинаться с / иначе они часть пути а не полный путь.

1

Другие решения

Ну вот:

^\/(?!.*\/$)(?!.*[\/]{2,})(?!.*\?.*\?)(?!.*\.\/).*

Функция образца:

function validateUrl($url){
if (preg_match('%^/(?!.*\/$)(?!.*[\/]{2,})(?!.*\?.*\?)(?!.*\.\/).*%im', $url)) {
return true;
} else {
return false;
}
}

Я использовал некоторые негативные смотреть вперед это исключает определенные закономерности.
Он соответствует только указанным вами «действительным путям».

Regex101Demo

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector