2016-12-01 25 views
0

$url_xxx = www.googlecomhttp://www.5555testetstcomhttp://wwwgooglecom它會回顯OK爲什麼?使用php不檢查url格式

<?PHP 
$url_xxx = mysqli_real_escape_string($db_mysqli,$_POST['url_xxx']); 
if(!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i",$url_xxx)) 
{ 
    echo "URL incorrect format"; 
} 
else 
{ 
    echo "OK"; 
} 
?> 
+0

因爲你的正則表達式是無效的?你爲什麼要在主機上檢查'[-a-z0-9 +&@#\ /%=〜_ |]'? – Devon

+0

如何使用parse_url'http:// php.net/manual/en/function.parse-url.php'來檢查url的部分。然後,如果需要,只用正則表達式檢查零件。 – JustOnUnderMillions

+0

你可以請我舉個例子嗎? –

回答

0

您的Regex形狀很糟糕。你可以分解成三部分。

  1. \ B(:(:HTTPS | FTP):???// | WWW)
  2. [-a-Z0-9 + & @#/(以http或https或此類啓動) %=〜_ |:?!;] *(任何字符)
  3. [-a-Z0-9 + & @#/%=〜_ |](任何字符)

你的表達讀取「以{1}開頭的任何內容,接着是可出現從0到多次的{2},接着是{3}(這是任何內容)」

所以,由於{2}是可選的,因爲*修飾符,它最終的讀法類似於「任何以http://開頭並且跟隨任何匹配的東西

首先,我會建議在構建時使用Rubular來檢查您的正則表達式他們,這是一個真正有用的網站http://rubular.com。如果你想修正正則表達式,你應該至少在中間需要一些點。

其次,對於這種特殊的情況下,你應該檢查 Best way to check if a URL is valid

其中剪斷從那裏的響應是戈登這樣的響應:

if (filter_var($url, FILTER_VALIDATE_URL) === FALSE) { 
    die('Not a valid URL'); 
} 
+0

仍然在此字符串上回顯「是」。爲什麼? '<?php $ url =「http://wwwgoogle.com」; if(filter_var($ url,FILTER_VALIDATE_URL)=== FALSE) { echo「NO」; } else { echo「YES」; } ?>' –

+0

http://wwwgoogle.com是一個有效的網址,例如http://google.com – Jimmy