在 PHP 中验证 url 的路径


Validate the path of a url in PHP

在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

不是正则表达式专家,我正在打破我的头,试图做一个看起来非常简单的事情。

你来了:

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

示例函数:

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

我使用了一些消极的前瞻性,排除了某些模式。它仅与您指定的"有效路径"匹配。

正则表达式101演示

我使用@cmorrissey的方法,它实际上不需要正则表达式:

$result = filter_var('http://www.example.com' . $path, FILTER_VALIDATE_URL);
if ($result !== false) {
    $result = true;
}

然后truefalse result,具体取决于路径有效性。请注意,路径应始终以/开头,否则它们是路径的一部分,而不是完整路径。