[PHP] 使用 filter_var 方法 FILTER_VALIDATE_URL 驗證連結的 Unicode 編碼問題

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;
}

使用這個包裝過的驗證方式,會協助把未編碼過的連結編碼過後才來驗證,避開這個錯誤!(儘管有編碼過,這邊就會「再」編碼來驗證,所以不適合把這樣多重處理的值拿來直接繼續用哦~)

有時候這種小地方發生錯誤,還真不是一下子能找到,要謹記謹記!


Share:

作者: Chun

資訊愛好人士。主張「人人都該為了偷懶而進步」。期許自己成為斜槓到變進度條 100% 的年輕人。[//////////____30%_________]

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *