在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;
}
然后true
或false
result
,具体取决于路径有效性。请注意,路径应始终以/
开头,否则它们是路径的一部分,而不是完整路径。