Nette\Utils\Validators::isUrl() ma problem s dlhou IDN domenou
- m@te
- Člen | 4
sorry, zla kategoria. Prosim presunut do hlasenie chyb
Nette\Utils\Validators::isUrl()
v aktualnej verzii 2.0.5 pre PHP 5.3 vrati pre url http://президент.рф/ true
avsak pre
dlhu url http://грузоперевозки-спецтехника-екатеринбург-окрестности.рф/
vrati false
Problem je ze v domene su multibyte znaky a neprejde validaciou na dlzku retazca – max 63 znakov.
Pre mna funguje, ked zmenim:
$alpha = "a-z\x80-\xFF";
pridat znaky azbuky (pravdepodobne treba pridat aj velke znaky) a zmenit uvodzovky na jednoduche.
$alpha = 'a-zа-я\x80-\xFF';
a v
return (bool) preg_match("(^https?://(?:(?:$domain\\.)*$topDomain|\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})(:\d{1,5})?(/\S*)?\\z)i", $value);
pridat modifikator u
return (bool) preg_match("(^https?://(?:(?:$domain\\.)*$topDomain|\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})(:\d{1,5})?(/\S*)?\\z)ui", $value);
Cela metoda potom vyzera takto:
public static function isUrl($value)
{
$alpha = 'a-zа-я\x80-\xFF';
$domain = "[0-9$alpha](?:[-0-9$alpha]{0,61}[0-9$alpha])?";
$topDomain = "[$alpha][-0-9$alpha]{0,17}[$alpha]";
return (bool) preg_match("(^https?://(?:(?:$domain\\.)*$topDomain|\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})(:\d{1,5})?(/\S*)?\\z)ui", $value);
}
To iste plati aj pre validaciu emailovej adresy isEmail()
Su nejake lepsie navrhy? Alebo mozeme pridat pull request?
Editoval m@te (11. 9. 2012 15:57)
- Filip Procházka
- Moderator | 4668
Oprav funkci, napiš testy, pošli pullrequest a Travis nám řekne, jestli je to funkční :)