Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Скрипт проверки обратной ссылки работает не корректно
Форумы портала PHP.SU » » Если скрипт не работает » Скрипт проверки обратной ссылки работает не корректно

Страниц (1): [1]
 

1. skillful - 05 Декабря, 2014 - 13:57:58 - перейти к сообщению
Здравствуйте. Нашел такой вот скрипт проверки обратной ссылки. Скрипт старый, под php 5.3 вообще отказывался работать. Я его не много подправил и он вроде заработал. Но если этим скриптом проверять допустим страницу http://manyweb.ru/page_6_1.html, то он видит только пару ссылок и то своих (http://manyweb.ru). Можно определить в чем проблема? В сайте? В скрипте?

PHP:
скопировать код в буфер обмена
  1. <?
  2. // http://kurilka.co.ua/archives/script-check-backlinks/
  3. class backlink
  4. {
  5.     var $errors = '';
  6.     var $backlink = '';
  7.     var $backlink_parse = array();
  8.     var $backlink_path = '';
  9.     var $backlink_path_ar = array();
  10.     function backlink($backlink)
  11.     {
  12.         $this->backlink            = $backlink;
  13.         $this->backlink_parse  = parse_url($backlink);
  14.         $this->backlink_path    = $this->backlink_parse['path'];
  15.         if ( substr($this->backlink_path,0,1)=='/' )    $this->backlink_path = substr($this->backlink_path,1);
  16.         if ( substr($this->backlink_path,-1)=='/' )    $this->backlink_path = substr($this->backlink_path,0,strlen($this->backlink_path)-1);
  17.         $backlink_path_ar          = explode("[/]", $this->backlink_path);
  18.         if ( count($backlink_path_ar)>0 )
  19.         {
  20.             foreach ( $backlink_path_ar as $k=>$v )
  21.             {
  22.                 $v = trim($v);
  23.                 if ( empty($v) ) unset($backlink_path_ar[$k]);
  24.             }
  25.         }
  26.         if ( count($backlink_path_ar)>0 ) $this->backlink_path_ar = $backlink_path_ar;
  27.     }
  28.     function subpath_check($rule)
  29.     {
  30.         if ( count($this->backlink_path_ar)>0 )
  31.         {
  32.             $path = '';
  33.             foreach ( $this->backlink_path_ar as $k=>$v )
  34.             {
  35.                 $path.= empty($path) ? $v : "\/".$v;
  36.                 //Здесь ошибка!! Починить потом sk.
  37.                 //if ( preg_match('/Disallow:\s*[\/]?'.$path.'[\/\*]?\s*$/i',$rule) ) return true;
  38.             }
  39.         }
  40.         return false;
  41.     }
  42.     function check($url)
  43.     {
  44.         $parse_url          = parse_url($url);
  45.         /* robotos.txt */
  46.         $robots_url        = 'http://'.$this->backlink_parse['host'].'/robots.txt';
  47.         $robots_data_ar = @file($robots_url);
  48.         if ($robots_data_ar !== false)
  49.         {
  50.             if (count($robots_data_ar) > 0)
  51.             {
  52.                 foreach ( $robots_data_ar as $k=>$v )
  53.                 {
  54.                     $v = trim($v);
  55.                     //echo '<pre>'. print_r ($v, true).'</pre>';
  56.                     if ( !empty($v) )
  57.                     {
  58.                         if ( preg_match('/Disallow:\s*\/\s*$/i',$v) ) // запрет индексации всего сайта
  59.                         {
  60.                             $this->errors = 'В '.$robots_url.' есть правило запрещающее индексировать сайт.';
  61.                             return false;
  62.                         }
  63.                         if (preg_match('/Disallow:\s*[\/]?'.str_replace("/","\/",$this->backlink_path).'[\/\$]\s*$/i',$v) || $this->subpath_check($v))
  64.                         {
  65.                             // запрет индексации пути к странице с ссылкой)
  66.                             $this->errors = 'В '.$robots_url.' есть правило запрещающее индексировать страницу '.$this->backlink;
  67.                             return false;
  68.                         }
  69.                     }
  70.                 }
  71.             }
  72.         }
  73.         /* META */
  74.         $meta = @get_meta_tags($this->backlink);
  75.         /*if (
  76.             eregi('noindex',$meta['robots']) ||
  77.             eregi('nofollow',$meta['robots'])
  78.         ) {
  79.             $this->errors = 'На странице '.$this->backlink.' есть META данные запрещающие её индексацию.';
  80.             return false;
  81.         }*/
  82.      
  83.         if (preg_match('/(nofollow|noindex)/i', $meta['robots']))
  84.         {
  85.             $this->errors = 'На странице '.$this->backlink.' есть META данные запрещающие её индексацию.';
  86.             return false;
  87.         }
  88.         /* Link */
  89.         $data = '';
  90.         $fp = @fopen($this->backlink,"r");
  91.         if ( $fp )
  92.         {
  93.             while (!feof($fp)) $data.= fgets ($fp,4096);
  94.             fclose ($fp);
  95.             $pattern = array (
  96.                 "'<script[^>]*?>.*?</script>'si", // Вырезается javascript
  97.                 "'<noscript[^>]*?>.*?</noscript>'si", // noscript
  98.                 "'<noindex[^>]*?>.*?</noindex>'si", // noindex
  99.                 "'<a[^>]*?rel=[\"\']nofollow[\"\'].*?>'si", //nofollow
  100.                 "'<\!--.*?-->'si", // remarka
  101.             );
  102.             $replace = array(" "," "," "," "," ");
  103.             $data = preg_replace($pattern, $replace, $data);
  104.             if (preg_match_all('/<a.*?href=["\']http:\/\/(.*?)["\']/i', $data, $m))
  105.             {
  106.                 if ( count($m[1])>0 )
  107.                 {
  108.                     foreach ( $m[1] as $k=>$v )
  109.                     {
  110.                         //exit('<pre>'. print_r ($m, true).'</pre>');
  111.                         if ($parse_url['host'] . $parse_url['path'] == $v)
  112.                         {
  113.                             return true;
  114.                         }
  115.                         if ($parse_url['host'] . $parse_url['path'] . '/' == $v)
  116.                         {
  117.                             return true;
  118.                         }
  119.                         /*if ( stripos($parse_url['host'], $v) )
  120.                         {
  121.                             return true;
  122.                         }*/
  123.                     }
  124.                 }
  125.             }
  126.             $this->errors = 'На странице '.$this->backlink.' ссылка '.$url.' не найдена или не доступна к индексации.';
  127.         }
  128.         else
  129.             $this->errors = 'Не удаётся открыть страницу '.$this->backlink;
  130.         return false;
  131.     }
  132. }
  133. define('BACKLINK_LOADED', 1);
  134. ?>


Этим кодом проверяем ссылку.
PHP:
скопировать код в буфер обмена
  1. $bl = new backlink("http://manyweb.ru/page_6_1.html");
  2. if ( !$bl->check("http://mysite.ru" . '') )
  3.     echo $bl->errors;


Если раскоментировать строку exit('<pre>'. print_r ($m, true).'</pre>');

Видно какие ссылки имеются на странице, но именно на этом сайте он не показывает необходимые ссылки, хотя они там есть http://manyweb[dot]ru/page_6_1[dot]html
Почему так?

PHP:
скопировать код в буфер обмена
  1.  
  2. <pre>
  3. (
  4.     [0] => Array
  5.         (
  6.             [0] =>
  7.   <a href="http://manyweb.ru/" [1]=""> </a>
  8.   <a href="http://manyweb.ru/" )="" [1]=""> Array
  9.         (
  10.             [0] => manyweb.ru/
  11.             [1] => manyweb.ru/
  12.         )
  13.  
  14. )
  15. </a>
  16. </pre>
  17.  
2. skillful - 19 Декабря, 2014 - 17:07:58 - перейти к сообщению
Кажется понял. Ссылки на этом сайте имеют вид: <a target=_blank href=http://manyweb.ru/page_6_1.html>http://manyweb.ru/page_6_1.html</a>

Т. е. href=http://manyweb.ru/page_6_1.html - без кавычек. Поэтому ссылки и не показываются. Отвечает за это, как я понял функция

if (preg_match_all('/<a.*?href=["\']http:\/\/(.*?)["\']/i', $data, $m))

Как ее подправить, чтоб захватить все ссылки с атрибутом href в котором нет кавычек "" (href=http://manyweb.ru/page_6_1.html)

 

Powered by ExBB FM 1.0 RC1