filter_var()でURLのフォーマットチェック(とバグ)

PHPにはfilter_var()という関数があって、この関数を使うとURLのフォーマットチェックができます。(PHP 5.2.0以降)

ですが、この関数のURLフォーマットチェックにはバグがあって、ドメイン部分にハイフンがあると「URLではない」と判定されてしまうようです。

  • PHP 5.3.2環境で確認(5.3.3でも修正されていない?)

正常:

<?php
$value = 'http://example.com/test.html';
$ret = filter_var($value, FILTER_VALIDATE_URL);
var_dump($ret);
$ php test.php
string(28) "http://example.com/test.html"

なんかおかしい:

<?php
$value = 'http://exam-ple.com/test.html';
$ret = filter_var($value, FILTER_VALIDATE_URL);
var_dump($ret);
$ php test.php  
bool(false)

ちなみに

LithiumのValidationでisUrl()を使うと、上のfilter_var()を使って検証が行われるため、ドメイン部分にハイフンが入ったURLはバリデーションエラーになってしまいます。

CakePHPでは、URLのバリデーションは自前の正規表現で行っているのでこの問題はないようです。