Скрипт проверки обратной ссылки работает не корректно

skillful

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

PHP:
<?
// http://kurilka.co.ua/archives/script-check-backlinks/
class backlink
{
    var $errors = '';
    var $backlink = '';
    var $backlink_parse = array();
    var $backlink_path = '';
    var $backlink_path_ar = array();
    function backlink($backlink)
    {
        $this->backlink            = $backlink;
        $this->backlink_parse  = parse_url($backlink);
        $this->backlink_path    = $this->backlink_parse['path'];
        if ( substr($this->backlink_path,0,1)=='/' )    $this->backlink_path = substr($this->backlink_path,1);
        if ( substr($this->backlink_path,-1)=='/' )    $this->backlink_path = substr($this->backlink_path,0,strlen($this->backlink_path)-1);
        $backlink_path_ar          = explode("[/]", $this->backlink_path);
        if ( count($backlink_path_ar)>0 )
        {
            foreach ( $backlink_path_ar as $k=>$v )
            {
                $v = trim($v);
                if ( empty($v) ) unset($backlink_path_ar[$k]);
            }
        }
        if ( count($backlink_path_ar)>0 ) $this->backlink_path_ar = $backlink_path_ar;
    }
    function subpath_check($rule)
    {
        if ( count($this->backlink_path_ar)>0 )
        {
            $path = '';
            foreach ( $this->backlink_path_ar as $k=>$v )
            {
                $path.= empty($path) ? $v : "\/".$v;
                //Здесь ошибка!! Починить потом sk.
                //if ( preg_match('/Disallow:\s*[\/]?'.$path.'[\/\*]?\s*$/i',$rule) ) return true;
            }
        }
        return false;
    }
    function check($url)
    {
        $parse_url          = parse_url($url);
        /* robotos.txt */
        $robots_url        = 'http://'.$this->backlink_parse['host'].'/robots.txt';
        $robots_data_ar = @file($robots_url);
        if ($robots_data_ar !== false)
        {
            if (count($robots_data_ar) > 0)
            {
                foreach ( $robots_data_ar as $k=>$v )
                {
                    $v = trim($v);
                    //echo '<pre>'. print_r ($v, true).'</pre>';
                    if ( !empty($v) )
                    {
                        if ( preg_match('/Disallow:\s*\/\s*$/i',$v) ) // запрет индексации всего сайта
                        {
                            $this->errors = 'В '.$robots_url.' есть правило запрещающее индексировать сайт.';
                            return false;
                        }
                        if (preg_match('/Disallow:\s*[\/]?'.str_replace("/","\/",$this->backlink_path).'[\/\$]\s*$/i',$v) || $this->subpath_check($v))
                        {
                            // запрет индексации пути к странице с ссылкой)
                            $this->errors = 'В '.$robots_url.' есть правило запрещающее индексировать страницу '.$this->backlink;
                            return false;
                        }
                    }
                }
            }
        }
        /* META */
        $meta = @get_meta_tags($this->backlink);
        /*if (
            eregi('noindex',$meta['robots']) ||
            eregi('nofollow',$meta['robots'])
        ) {
            $this->errors = 'На странице '.$this->backlink.' есть META данные запрещающие её индексацию.';
            return false;
        }*/
      
        if (preg_match('/(nofollow|noindex)/i', $meta['robots']))
        {
            $this->errors = 'На странице '.$this->backlink.' есть META данные запрещающие её индексацию.';
            return false;
        }
        /* Link */
        $data = '';
        $fp = @fopen($this->backlink,"r");
        if ( $fp )
        {
            while (!feof($fp)) $data.= fgets ($fp,4096);
            fclose ($fp);
            $pattern = array (
                "'<script[^>]*?>.*?</script>'si", // Вырезается javascript
                "'<noscript[^>]*?>.*?</noscript>'si", // noscript
                "'<noindex[^>]*?>.*?</noindex>'si", // noindex
                "'<a[^>]*?rel=[\"\']nofollow[\"\'].*?>'si", //nofollow
                "'<\!--.*?-->'si", // remarka
            );
            $replace = array(" "," "," "," "," ");
            $data = preg_replace($pattern, $replace, $data);
            if (preg_match_all('/<a.*?href=["\']http:\/\/(.*?)["\']/i', $data, $m))
            {
                if ( count($m[1])>0 )
                {
                    foreach ( $m[1] as $k=>$v )
                    {
                        //exit('<pre>'. print_r ($m, true).'</pre>');
                        if ($parse_url['host'] . $parse_url['path'] == $v)
                        {
                            return true;
                        }
                        if ($parse_url['host'] . $parse_url['path'] . '/' == $v)
                        {
                            return true;
                        }
                        /*if ( stripos($parse_url['host'], $v) )
                        {
                            return true;
                        }*/
                    }
                }
            }
            $this->errors = 'На странице '.$this->backlink.' ссылка '.$url.' не найдена или не доступна к индексации.';
        }
        else
            $this->errors = 'Не удаётся открыть страницу '.$this->backlink;
        return false;
    }
}
define('BACKLINK_LOADED', 1);
?>
Этим кодом проверяем ссылку.
PHP:
$bl = new backlink("http://manyweb.ru/page_6_1.html");
if ( !$bl->check("http://mysite.ru" . '') )
    echo $bl->errors;
Если раскоментировать строку exit('<pre>'. print_r ($m, true).'</pre>');

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

PHP:
<pre>
  Array
(
    [0] => Array
        (
            [0] =>
  <a href="http://manyweb.ru/" [1]=""> </a>
  <a href="http://manyweb.ru/" )="" [1]=""> Array
        (
            [0] => manyweb.ru/
            [1] => manyweb.ru/
        )

)
</a>
</pre>
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Потому, что какой-то кусок кода работает не так. Отладка и вывод ошибок спасут ситуацию.
 

skillful

Новичок
Отладка и вывод ошибок не спасают ситуацию. Проблема в функции которая ищет все ссылки на странице.
И похоже вот она:
PHP:
if (preg_match_all('/<a.*?href=["\']http:\/\/(.*?)["\']/i', $data, $m))
Примеры ссылок которая она видит:
Код:
<a href="http://manyweb.ru/page_6_1.html">http://manyweb.ru/page_6_1.html</a>
<a href='http://manyweb.ru/page_6_1.html'>http://manyweb.ru/page_6_1.html</a>
А вот ссылка функция которая не видит:
Код:
<a href=http://manyweb.ru/page_6_1.html>http://manyweb.ru/page_6_1.html</a>
Что изменить в функции preg_match_all('/<a.*?href=["\']http:\/\/(.*?)["\']/i', $data, $m), что-бы ссылка вида href=http://manyweb.ru/page_6_1.html тоже находилась?
 

mustafa

Новичок
можно почитать регулярные выражения, но это же очень скучно и не итересно
 

DiMA

php.spb.ru
Команда форума
можно почитать регулярные выражения, но это же очень скучно и не итересно
У людей, которых нет проблемы с регами, ответ по существу (регом) занимает меньше секунд и тыканий клавы, чем очередная умная острота.

/<a.*?href=["\']?http:\/\/(.*?)["\'\s>]/i
 

WMix

герр M:)ller
Партнер клуба
DiMA, я знаю ты мастер по регексам, открой тайну, научи прекрасному!
 
  • Like
Реакции: BRat

skillful

Новичок
У людей, которых нет проблемы с регами, ответ по существу (регом) занимает меньше секунд и тыканий клавы, чем очередная умная острота.

/<a.*?href=["\']?http:\/\/(.*?)["\'\s>]/i
Ооо. Спасибо Вам большое. Я уж думал здесь никто никогда не отвечает нормально, а только дают советы. Спасибо еще раз.
 

С.

Продвинутый новичок
Отвечают, если ты сам нашел ошибку, но не знаешь, как ее исправить.
А если типа: "Вот мой код,там ничего не работает. Подсуетитесь-ка", то не только посоветуют, но и дорогу покажут.
 

skillful

Новичок
Отвечают, если ты сам нашел ошибку, но не знаешь, как ее исправить.
А если типа: "Вот мой код,там ничего не работает. Подсуетитесь-ка", то не только посоветуют, но и дорогу покажут.

Да пожалуйста. Нашел ошибку и не знаю как ее исправить:
Код:
preg_match_all('/<a.*?href=["\']http:\/\/(.*?)["\']/i', $data, $m)
В ответ мне:
можно почитать регулярные выражения, но это же очень скучно и не итересно
Получается: Я не просил "Подсуетитесь-ка", сам нашел ошибку. А мне вместо того как помочь исправить мою ошибку, сказали читать про регулярные выражения, которые для меня мол будут скучными и не интересными. Получается не ответили.

C. так зачем ты написал в топик, если я нашел ошибку и не знаю как ее исправить?
Получается ты не прав...
 

DiMA

php.spb.ru
Команда форума
Не выпендривайся .-) Как помогли, так и разпомогут.
 

AnrDaemon

Продвинутый новичок
Отладка и вывод ошибок не спасают ситуацию. Проблема в функции которая ищет все ссылки на странице.
И похоже вот она:
PHP:
if (preg_match_all('/<a.*?href=["\']http:\/\/(.*?)["\']/i', $data, $m))
Примеры ссылок которая она видит:
Код:
<a href="http://manyweb.ru/page_6_1.html">http://manyweb.ru/page_6_1.html</a>
<a href='http://manyweb.ru/page_6_1.html'>http://manyweb.ru/page_6_1.html</a>
А вот ссылка функция которая не видит:
Код:
<a href=http://manyweb.ru/page_6_1.html>http://manyweb.ru/page_6_1.html</a>
Что изменить в функции preg_match_all('/<a.*?href=["\']http:\/\/(.*?)["\']/i', $data, $m), что-бы ссылка вида href=http://manyweb.ru/page_6_1.html тоже находилась?
Ничего не надо. Надо исправить ссылку в вашем HTML.
 
Сверху