Okazało się że narodowe TLD można sobie podarować, zrobiłem więc tak:
<?php
$input = $_REQUEST['input'];
// W pierwszym kroku zamieniamy wszystkie znaki ASCII
// które nie moga wchodzić w nazwę domeny, na spacje (spacja to teraz jedyny separator)
'special' => '~`!@\#$%^&*()_=+\[{\]}\\|;:\'",<>/?',
'whitespace' => ' \r\n '
);
// HINT: Możnaby opcjonalnie potraktować przecinek jako kropkę..
$patt = '#['.$chars['special'].$chars['whitespace'].']+#';
// Sprawdzamy czy kazdy z ciagow konczy sie prawidlowym TLD (pomineliśmy narodowe TLD godnie z zamówieniem)
'ac','ad','ae','aero','af','ag','ai','al','am','an','ao','aq','ar',
'arpa','as','asia','at','au','aw','ax','az','ba','bb','bd','be','bf',
'bg','bh','bi','biz','bj','bm','bn','bo','br','bs','bt','bv','bw',
'by','bz','ca','cat','cc','cd','cf','cg','ch','ci','ck','cl','cm',
'cn','co','com','coop','cr','cu','cv','cw','cx','cy','cz','de','dj',
'dk','dm','do','dz','ec','edu','ee','eg','er','es','et','eu','fi',
'fj','fk','fm','fo','fr','ga','gb','gd','ge','gf','gg','gh','gi',
'gl','gm','gn','gov','gp','gq','gr','gs','gt','gu','gw','gy','hk',
'hm','hn','hr','ht','hu','id','ie','il','im','in','info','int','io',
'iq','ir','is','it','je','jm','jo','jobs','jp','ke','kg','kh','ki',
'km','kn','kp','kr','kw','ky','kz','la','lb','lc','li','lk','lr','ls',
'lt','lu','lv','ly','ma','mc','md','me','mg','mh','mil','mk','ml',
'mm','mn','mo','mobi','mp','mq','mr','ms','mt','mu','museum','mv',
'mw','mx','my','mz','na','name','nc','ne','net','nf','ng','ni','nl',
'no','np','nr','nu','nz','om','org','pa','pe','pf','pg','ph','pk',
'pl','pm','pn','pr','pro','ps','pt','pw','py','qa','re','ro','rs',
'ru','rw','sa','sb','sc','sd','se','sg','sh','si','sj','sk','sl','sm',
'sn','so','sr','st','su','sv','sx','sy','sz','tc','td','tel','tf',
'tg','th','tj','tk','tl','tm','tn','to','tp','tr','travel','tt','tv',
'tw','tz','ua','ug','uk','us','uy','uz','va','vc','ve','vg','vi','vn',
'vu','wf','ws','xxx','ye','yt','za','zm','zw',
);
foreach ( explode(' ', $list) as $item ) {
if ( false === $tld_pos = strrpos( $item, '.' )) { // tekst w danej linii nie zawiera kropki, nie ma TLD
continue;
}
$tld = substr( $item, $tld_pos + 1
);
continue;
}
if ( '-' === $item{0} ) { // domena nie moze się zaczynać od myślinka: '-'
$item = ltrim($item, '-'); }
if ( false !== strstr( $item, '--' )) { continue; // pomijamy jeśli w ciągu są dwa sąsiadujące znaki równości, mimo że możnaby podjąć próbę naprawy..
}
$output[] = $item;
}
Dużo brakuje do doskonałości.
Celne uwagi i twórcza krytyka mile widziane.