CakePHP1.2のバリデーションでurlがチルダをエラーにしてしまう

ということで、タイトル通り。

http://hogehoge.com/~foo

みたいなチルダが入っている値だと、入力エラーになる。

調べてみると、ちらほら同じような人が見つかる。
CakePHPのvalidateで、チルダが入っているとURLとして認識してくれない « 15Pub
CakePHP-ja tumblr - Validation::url() が URL の ~ に反応する件への

けど、具体的な解決策が見つからなかったので、コードを晒しておく。
# app/app_model.php

function url($data, $strict = false) {
	$check = is_array($data) ? array_shift($data) : $data;

	$_this =& Validation::getInstance();
	$_this->check = $check;
	$validChars = '([' . preg_quote('~!"$&\'()*+,-.@_:;=') . '\/0-9a-z]|(%[0-9a-f]{2}))';         // 「~」を追加
	$_this->regex = '/^(?:(?:https?|ftps?|file|news|gopher):\/\/)' . ife($strict, '', '?') .
		'(?:' . $_this->__pattern['ip'] . '|' . $_this->__pattern['hostname'] . ')(?::[1-9][0-9]{0,3})?' .
		'(?:\/?|\/' . $validChars . '*)?' .
		'(?:\?' . $validChars . '*)?' .
		'(?:#' . $validChars . '*)?$/i';
	return $_this->_check();
}


参考サイトを真似してvalidCharsにチルダを追加しておいた。
cake/libs/validation.phpに手を入れるのは嫌なので、app/app_model.phpに上記を追加。

んー、チルダをURLに含むべきではないってのはそうかもしれないんだけど、柔軟に対応して欲しいところだね。

※2010/05/06 追記 1.3では無事問題ないようです

コメント

アーカイブ

2010

2009

2008

2007

コンタクト

longkey1[at]gmail[dot]com