$re = '/^((?!-))(xn--)?[a-z0-9][a-z0-9-_]{0,61}[a-z0-9]{0,}\.?((xn--)?([a-z0-9\-.]{1,61}|[a-z0-9-]{0,30})\.[a-z-1-9]{2,})$/m';
$str = '1c.ru
222.ru
g.com
111.222.22.2
2.eu
localhost
54.ru
ya.ru
www.pmmp.eiiil
129.0.0.100
127.0.0.1
22.22.22.220000
xn--b1aaa6i.xn--s1ak
sub.mkyong-info.com
mkyong.com.au
g.co
www.mk.mk.com
www.pl.bluemedia-testserver.ts.twisto.wtf
wwww.wwww.wwww.ww.w.wwww.www.ee
https://regex101.com/r/sP0rLU/1/
foodemo.net
bar.ba.test.co.uk
www.demo.com
http://foo.co.uk/
g.com
g-.com
com.g
-g.com
xn--d1ai6ai.xn--p1ai
xn--fsqu00a.xn--com
xn--stackoverflow.com
stackoverflow.xn--com
stackoverflow.co.uk
google.com.au
xn--b1aaaaaaaaaaaa96a.xn--b1aaaaaaaaaaaaa2vvc
-0-0o.com
a.net
0-0o.com
0-oz.co.uk
0-tension.com.br
0-wh-ao14-0.com-com.net
a-1234567890-1234567890-1234567890-1234567890-1234567890-1234-z.eu.us
a-1234567890-1234567890-1234567890-1234567890-1234567890-12345-z.eu.us (too long)
List of valid domain names:
www.google.com
google.com
mkyong123.com
mkyong-info.com
sub.mkyong.com
sub.mkyong-info.com
mkyong.com.au
g.co
mkyong.t.t.co
List of invalid domain:
mkyong.t.t.c
mkyong,com
';
preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);
// Print the entire match result
var_dump($matches);
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for PHP, please visit: http://php.net/manual/en/ref.pcre.php