本篇文章更新時間:2020/03/21
如有資訊過時或語誤之處,歡迎使用 Contact 功能通知。
一介資男的 LINE 社群開站囉!歡迎入群聊聊~
如果本站內容對你有幫助,歡迎使用 BFX Pay 加密貨幣 或 新台幣 贊助支持。
PHP 裡驗證連結的方法自己寫可能就是使用 parse_url 方法拆結構來判斷。另一個我常用的是 filter_var('https://www.mxp.tw', FILTER_VALIDATE_URL)
這方法。
今天突然測試到 FILTER_VALIDATE_URL
方法怎驗證一個應該正確的連結,但顯示錯誤!? 觀察結果應該是 Unicode 編碼相關的問題,找了些關鍵字才找到這篇討論(也關鍵字薄弱的一個標題): PHP filter_var() - FILTER_VALIDATE_URL
大部分情況下因為瀏覽器會將 Unicode 編碼的字元使用 URI資源編碼方式 轉存,所以傳給 Filter 的時候判斷會正確,但預設 FILTER_VALIDATE_URL
這個驗證方式不會幫你轉,所以如果直接把 Unicode 編碼的連結喂給他判斷就會回傳失敗!
下方有人提供一個解法:
function validate_url($url) {
$path = parse_url($url, PHP_URL_PATH);
$encoded_path = array_map('urlencode', explode('/', $path));
$url = str_replace($path, implode('/', $encoded_path), $url);
return filter_var($url, FILTER_VALIDATE_URL) ? true : false;
}
使用這個包裝過的驗證方式,會協助把未編碼過的連結編碼過後才來驗證,避開這個錯誤!(儘管有編碼過,這邊就會「再」編碼來驗證,所以不適合把這樣多重處理的值拿來直接繼續用哦~)
有時候這種小地方發生錯誤,還真不是一下子能找到,要謹記謹記!