Регистрация Войти
Войти через VK Войти через FB Войти через Google Войти через Яндекс
Войти через VK Войти через FB Войти через Google Войти через Яндекс
Поиск по сайту
Извлечение ссылок из HTML-документов
При написании ботов на PHP часто требуется функция для извлечения всех ссылок на странице. Я для этого использую следующую функцию:
function extract_links($html, $from_url)
{
mb_internal_encoding('utf-8');
mb_regex_encoding('utf-8');
$from_url = get_host($from_url);
$arr = [];
$out = [];
$html = str_replace(' ', ' ', $html);
$html = mb_ereg_replace('\s+', ' ', $html, 'is');
$html = preg_replace('#<!--.*-->#Uuis', '', $html);
$html = preg_replace('#<script[^>]*>.*</script[^>]*>#Uuis', '', $html);
$html = preg_replace('#<style[^>]*>.*</style[^>]*>#Uuis', '', $html);
$html = preg_replace_callback('#<noindex[^>]*>(.*)</noindex[^>]*>#Uuis', 'extract_links_callback', $html);
if (preg_match_all('#<(a|area)(\s+?[^>]*?\s+?|\s+?)href\s*=\s*(["\'`]*)\s*?([^>\s]+)\s*\3[^>]*?(/>|>(.*?)</\1>|>)#is', $html, $arr, PREG_SET_ORDER))
{
foreach($arr as $one)
{
$this_href = trim(mb_strtolower($one[4]), ' "\'');
if ($this_href == '') $this_href = '/';
if (substr($this_href, 0, 11) == 'javascript:') continue;
if (substr($this_href, 0, 7) == 'mailto:') continue;
$this_text = '';
if (count($one)>6) $this_text = strip_tags(str_replace('<', ' <', $one[6]));
$this_text = trim(preg_replace('#&(\#\d+|[a-z]+);#uis', ' ', $this_text));
$this_text = trim(preg_replace('#[\'"&<>`]+#uis', ' ', $this_text));
$this_text = trim((str_replace('•', ' ', (strip_tags(trim($this_text))))));
$this_text = str_replace('=', ' ', $this_text);
$this_text = preg_replace('#\s+#uis', ' ', $this_text);
if ($this_text=='') $this_text = 'n/t';
$this_nofollow = (preg_match('#rel\s*=[\s"\']*nofollow#uis', $one[0]));
$this_noindex = (preg_match('#rel\s*=[\s"\']*noindex#uis', $one[0]));
$this_type = (!preg_match('#^http://#is', $this_href)||preg_match('#^http://'.preg_quote($from_url, '#').'#is', $this_href)||preg_match('#^http://'.preg_quote(fix_www($from_url), '#').'#is', $this_href)) ? 'int' : 'ext';
$out[] = array('href'=>$this_href, 'text'=>$this_text, 'nofollow'=>$this_nofollow, 'noindex'=>$this_noindex, 'type'=>$this_type);
}
}
return $out;
}
function extract_links_callback($matches)
{
return preg_replace('# href\s*=#Uuis', ' rel="noindex" href=', $matches[1]);
}
function fix_www($host)
{
if (substr($host, 0, 4)==='www.')
{
$host = preg_replace('#^www.#Uis', '', $host);
}
else
{
$host = 'www.' . $host;
}
return $host;
}
function get_host($s)
{
$s = preg_replace('#^http://#Uis', '', trim($s));
$s = explode('/', trim($s));
$s = trim($s[0]);
$s = explode(':', $s);
$s = trim($s[0]);
return $s;
}
.
Прокомментировать/Отблагодарить