ugrás a tartalomhoz

Domain validáció + IDN

vrnagy · 2014. Már. 20. (Cs), 22.26
Sziasztok,

Egy Symfony2 projekthez szükségem van domain validációra, viszont problémába ütköztem a nemzetközi domainekkel.

Jelenleg a Respect\Validation domain validátorát integráltam, ami alapesetben jól is működik.

A példa.hu punycode változatát (xn--plda-bpa.hu) jól validálja viszont a subdomaineket már nem. A mail.xn--plda-bpa.hu a validátor szerint már nem érvényes.

A hiba forrását már megtaláltam, és akár javítható is, viszont ez most egy ágyúval verébre kategória, mivel a domain validáción kívül mást nem használok belőle.

Próbáltam keresni a Packagisten és a Google-ön is, de eddig eredménytelenül.
Tudtok valamilyen egyszerű domain validátort, ami minden RFC szabályt betart, és boldogul a nemzetközi domainekkel?

A probléma forrása az, hogy a validátor csak a domain legelején figyeli az xn-- karektersorozatot:

$this->checks[] = new OneOf(new Not(new Contains('--')),
	new AllOf(new StartsWith('xn--'),
		new Callback(function ($str) {
			return substr_count($str, "--") == 1;
		})));
Köszönettel,
vrnagy
 
1

Nekem ez regexpért kiált.

Hidvégi Gábor · 2014. Már. 21. (P), 13.01
Nekem ez regexpért kiált.
2

Én is erre gondoltam, egy

vrnagy · 2014. Már. 21. (P), 14.54
Én is erre gondoltam, egy regexet már össze is dobtam hozzá, de még nem tökéletes.

A regex darabonként vizsgálja a domaint, egy darab az első .-ig tart (mail.example.com-ból mail. és example. lesz)

Az első, és pont előtti utolsó karakter csak alfanumerikus lehet.
A köztes rész tartalmazhat kötőjelet.
A végén kötelezően egy TLD van, amit később az ICANN hivatalos listájából nyerek ki.

Ez jelenleg így néz ki, csak hu és com TLD-vel:
^((xn--|[a-zA-Z0-9])([a-zA-Z0-9\-]){1,}[a-zA-Z0-9]\.){1,}(com|hu)$
Ott viszont elakadtam, hogy kizárjam a dupla kötőjelet a domain közepén.
Tehát hogy az ex--ample.com ne legyen valid, de az xn--plda-bpa.hu igen.
3

Ezt találtam

Hidvégi Gábor · 2014. Már. 21. (P), 16.48
4

Köszi a linket. Én egy másik

vrnagy · 2014. Már. 21. (P), 17.41
Köszi a linket. Én egy másik megközelítést próbáltam egy tutorial alapján, de azzal nem sikerült. Amit linkeltél, viszont jó megoldás, köszi.

A végső regexp:
^(((xn--|[a-zA-Z0-9])((?!--)[a-zA-Z0-9\-]){0,}[a-zA-Z0-9]\.)+|[a-zA-Z0-9]+\.){1,}(com|hu)$