Проверка URL-адресов PHP

Я знаю, что существует бесконечное количество потоков, задающих этот вопрос, но я не смог найти тот, который может мне помочь.

Я в основном пытаюсь проанализировать список из примерно 10 000 000 URL-адресов, убедитесь, что они действительны для следующих критериев, а затем получают URL-адрес корневого домена. Этот список содержит практически все, что вы можете себе представить, включая такие вещи, как (и ожидаемый отформатированный URL-адрес):

biy.ly/test [VALID] [return - bit.ly] example.com/apples?test=1&id=4 [VALID] [return - example.com] host101.wow404.apples.test.com/cert/blah [VALID] [return - test.com] 101.121.44.xxx [**inVALID**] [return false] localhost/noway [**inVALID**] [return false] www.awesome.com [VALID] [return - awesome.com] i am so awesome [**inVALID**] [return false] http://404.mynewsite.com/visits/page/view/1/ [VALID] [return - mynewsite.com] www1.151.com/searchresults [VALID] [return - 151.com] 

Есть ли у кого-нибудь какие-либо предложения по этому поводу?

 ^(?:https?://)?(?:[a-z0-9-]+\.)*((?:[a-z0-9-]+\.)[az]+) 

объяснение

 ^ # start-of-line (?: # begin non-capturing group https? # "http" or "https" :// # "://" )? # end non-capturing group, make optional (?: # start non-capturing group [a-z0-9-]+\. # a name part (numbers, ASCII letters, dashes) & a dot )* # end non-capturing group, match as often as possible ( # begin group 1 (this will be the domain name) (?: # start non-capturing group [a-z0-9-]+\. # a name part, same as above ) # end non-capturing group [az]+ # the TLD ) # end group 1 

http://rubular.com/r/g6s9bQpNnC

Я бы начал с дефолта:

 filter_var($inputUrl, FILTER_VALIDATE_URL); 

Затем добавьте свои особые случаи вещей, которые неприемлемы для дальнейшей проверки. Это должно немного упростить.

Что касается получения хоста.

 parse_url($inputUrl, PHP_URL_HOST); 

^(([a-zA-Z](\.[a-zA-Z])+)|([0-9]{1,3}(\.[0-9]{1,3}){3})/.*$

редактировать

В php это будет preg_match ( '^(([a-zA-Z](\.[a-zA-Z])+)|([0-9]{1,3}(\.[0-9]{1,3}){3})/.*$' , $myUrls , $matches)

То, что вам нужно, должно быть в $matches[1]

 $website = test_input($_POST["website"]); if (!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i",$w$website = test_input($_POST["website"]); if (!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i",$website)) { $websiteErr = "Invalid URL"; }ebsite)) { $websiteErr = "Invalid URL"; }