在PHP

时间:2016-04-26 17:16:05

标签: php regex url path

在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 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:0)

你走了:

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

示例功能:

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

我使用了一些排除某些模式的否定look-ahead。 它仅匹配"有效路径"你指定了。

Regex101Demo