在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 :(得分:2)
我使用@ cmorrissey的方法,实际上不需要正则表达式:
$result = filter_var('http://www.example.com' . $path, FILTER_VALIDATE_URL);
if ($result !== false) {
$result = true;
}
result
则为true
或false
,具体取决于路径有效性。请注意,路径应始终以/
开头,否则它们路径的一部分而非完整路径。
答案 1 :(得分:0)
你走了:
^\/(?!.*\/$)(?!.*[\/]{2,})(?!.*\?.*\?)(?!.*\.\/).*
示例功能:
function validateUrl($url){
if (preg_match('%^/(?!.*\/$)(?!.*[\/]{2,})(?!.*\?.*\?)(?!.*\.\/).*%im', $url)) {
return true;
} else {
return false;
}
}
我使用了一些排除某些模式的否定look-ahead。 它仅匹配"有效路径"你指定了。