Как проверить, является ли URL-адрес внешним URL-адресом или внутренним URL-адресом с помощью PHP?

Я получаю все ahrefs страницы с этим циклом:

foreach($html->find('a[href!="#"]') as $ahref) { $ahrefs++; } 

Я хочу сделать что-то вроде этого:

 foreach($html->find('a[href!="#"]') as $ahref) { if(isexternal($ahref)) { $external++; } $ahrefs++; } 

Где isexternal – функция

 function isexternal($url) { // FOO... // Test if link is internal/external if(/*condition is true*/) { return true; } else { return false; } } 

Помогите!

Related of "Как проверить, является ли URL-адрес внешним URL-адресом или внутренним URL-адресом с помощью PHP?"

Используйте parse_url и сравните хост с вашим локальным хостом (часто, но не всегда он совпадает с $_SERVER['HTTP_HOST'] )

 function isexternal($url) { $components = parse_url($url); return !empty($components['host']) && strcasecmp($components['host'], 'example.com'); // empty host will indicate url like '/relative.php' } 

Hovewer это будет рассматривать http://www.example.com и example.com как разные хосты. Если вы хотите, чтобы все ваши поддомены рассматривались как локальные ссылки, функция будет несколько больше:

 function isexternal($url) { $components = parse_url($url); if ( empty($components['host']) ) return false; // we will treat url like '/relative.php' as relative if ( strcasecmp($components['host'], 'example.com') === 0 ) return false; // url host looks exactly like the local host return strrpos(strtolower($components['host']), '.example.com') !== strlen($components['host']) - strlen('.example.com'); // check if the url host is a subdomain } 
 function isexternal($url) { // FOO... // Test if link is internal/external if(strpos($url,'domainname.com') !== false || strpos($url,"/") === '0') { return true; } else { return false; } } 

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

 function IsResourceLocal($url){ if( empty( $url ) ){ return false; } $urlParsed = parse_url( $url ); $host = $urlParsed['host']; if( empty( $host ) ){ /* maybe we have a relative link like: /wp-content/uploads/image.jpg */ /* add absolute path to begin and check if file exists */ $doc_root = $_SERVER['DOCUMENT_ROOT']; $maybefile = $doc_root.$url; /* Check if file exists */ $fileexists = file_exists ( $maybefile ); if( $fileexists ){ /* maybe you want to convert to full url? */ return true; } } /* strip www. if exists */ $host = str_replace('www.','',$host); $thishost = $_SERVER['HTTP_HOST']; /* strip www. if exists */ $thishost = str_replace('www.','',$thishost); if( $host == $thishost ){ return true; } return false; } 

Вероятно, вы захотите проверить, находится ли ссылка в том же домене. Это будет работать, только если все ваши атрибуты href являются абсолютными и содержат домен. Относительные, такие как /test/file.html, сложны, потому что у вас могут быть папки с таким же именем, как и домены. Итак, если у вас есть полный URL-адрес в каждой ссылке:

 function isexternal($url) { // Test if link is internal/external if(stristr($url, "myDomain.com") || strpos($url,"/") == '0') return true; else return false; }