2016-04-26 75 views
0

在PHP中,我試圖用正則表達式來驗證URL的路徑。 我已經測試目前正則表達式是這一個: ^(\/\w+)+\.\w+(\?(\w+=[\w\d]+(&\w+=[\w\d]+)+)+)*$在PHP中驗證url的路徑

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

你是否正在尋找一個文件/頁面是否實際存在於所提供的URL? – cmorrissey

+2

'filter_var('http://nothing.com'。$ urlPath,FILTER_VALIDATE_URL)'將驗證URL – cmorrissey

+0

@cmorrissey'FILTER_VALIDATE_URL'不適用於這個例子'http://somesite.com/asd/asd。 jsp&bar = baz?inga = 42?quux' - https://ideone.com/BRHXpU –

回答

0

在這裏你去:

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

採樣功能:

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

我用一些負面look-ahead是排除某些模式。 它僅匹配您指定的「有效路徑」。

Regex101Demo

+0

佩德羅,謝謝你的幫助。 但我想驗證所有路徑,不僅僅是我指定的示例「有效路徑」。 例如。與你正則表達這個路徑'/'+ $(abc.abcd [zz] .wxyz).azerty('是的,但不是。 – LeMoussel

+0

我明白你的觀點,你可以嘗試擴展正則表達式-aheads。 –

0

我用@ cmorrissey的做法,這實際上並不需要的正則表達式:

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

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

result然後truefalse取決於路徑的有效性。請注意,路徑始終應始於/,否則它們是部分路徑而不是完整路徑。