コード例 #1
0
ファイル: wget.php プロジェクト: romlg/cms36
function &new_wget($text, $url, $mod_rewrite_enabled, $id_array)
{
    debug_no_info();
    global $log_file;
    $result = new wget_result();
    $web_sufix = array(".html", ".php", ".htm");
    $address_symbol = array(".", "#");
    $separators = array("''", '""', "()", ">", " ");
    $hrefs = array("href=", "src=", "background-image: url", "background: url", "window.open(");
    $download_file_sufix = array(".gif", ".jpg", ".doc", ".xls", ".js", ".zip", ".css", ".swf");
    $parse_file_sufix = array(".html", ".htm");
    //получаем имя хоста в виде http://host.domain
    $host = del_from_left($url, strlen("http://"));
    $buff = explode("/", $host);
    $host = "http://" . $buff[0];
    // Надо заменить конструкицю вида onclick="openImage(this.href);return false;"
    $text = preg_replace("/(onclick=\"openImage\\(this.href\\);return false;\") href=\"(.*)/", " href=\"/scripts/popup.php?img=\\2", $text);
    //echo "$host\n\n\n\n\n\n";
    //получаем ссылку на серве:
    $server_link = del_from_left($url, strlen($host));
    //получаем рабочую директорию на серве, если не включен мод-реврайт
    if ($mod_rewrite_enabled) {
        $path_for_relative = $host . '/';
        $clean_url = "/";
    } else {
        //ищем гадские символы . ? # которые портят адресную строку
        foreach ($address_symbol as $symbol) {
            if (strpos($server_link, $symbol)) {
                $positions[] = strpos($server_link, $symbol) - 1;
            }
        }
        if (sizeof($positions) > 1) {
            $min = $positions[0];
            foreach ($positions as $pos) {
                if ($pos < $min) {
                    $min = $pos;
                }
            }
        } elseif (sizeof($positions) == 1) {
            $min = $positions[0];
        } else {
            $min = strlen($server_link);
        }
        //нашли первое вхождение гадского символа - и получили урл без него
        $clean_url = del_from_right($server_link, strlen($server_link) - $min - 1);
        if ($clean_url == $server_link) {
            //небыло гадских символов - числый урл
            if (last_char($clean_url) != '/') {
                $clean_url = $server_link . "/";
            }
        } else {
            if (isset($tmp)) {
                unset($tmp);
            }
            //удаляем весь хлам из конца строки до последнего слэша
            while ($tmp != '/') {
                $tmp = last_char($clean_url);
                $clean_url = del_from_right($clean_url, 1);
            }
            //доваляем только что стертый слэш ;]
            $clean_url = $clean_url . '/';
        }
        $path_for_relative = $host . $clean_url;
    }
    //обнуляем хлам
    unset($tmp);
    unset($pos);
    unset($min);
    //обработка урла закончена - начинаем делать мозги с заменой ссылок.
    foreach ($separators as $sep) {
        if (strlen($sep) == 2) {
            $double_sep[] = $sep;
        } else {
            $single_sep[] = $sep;
        }
    }
    //debug
    //echo "found ".sizeof($double_sep)." double separators and ".sizeof($single_sep)." single separators<br>";
    foreach ($hrefs as $href_name) {
        $buff = explode($href_name, $text);
        //начинаем перебор всех ссылок
        for ($i = 1; $i < sizeof($buff); $i++) {
            //для начала найдем какой из разделителей встречается первым
            //проверяем начинается ли строка с одного из двойных разделителей
            unset($current_sep);
            foreach ($double_sep as $sep) {
                if (first_char($buff[$i]) == first_char($sep)) {
                    $current_sep = $sep;
                }
            }
            //а если не начинается - выбираем одинарный разделитель
            if (!isset($current_sep)) {
                $single_sep_pos = strlen($buff[$i]);
                foreach ($single_sep as $sep) {
                    if (strpos($buff[$i], $sep) && $single_sep_pos > strpos($buff[$i], $sep)) {
                        $single_sep_pos = strpos($buff[$i], $sep);
                        $current_sep = $sep;
                    }
                }
            }
            //разделитель выбран - начинаем получение кода ссылки
            //откуда начинается код ссылки
            if (strlen($current_sep) == 2) {
                $pos_start = 1;
            } else {
                $pos_start = 0;
            }
            //где заканчивается код ссылки
            $tmp = del_from_left($buff[$i], 1);
            $pos_end = strpos($tmp, last_char($current_sep));
            $src_link = substr($buff[$i], $pos_start, $pos_end);
            //ссылка из кода и ее позиции получены, начинаем преобразование в ссылку для cd
            //echo $src_link."\n\n";
            if (first_char($src_link) == '/') {
                //первый символ ссылки - слэш - ссылка абсолютная в пределах домена
                $cd_link = $src_link;
                $full_link = $host . $cd_link;
            } elseif (if_prefix($src_link, 'http://')) {
                //ссылка совсем абсолютная
                if (if_prefix($src_link, $host)) {
                    //ссылка совсем абсолютная но ведет на наш домен
                    $cd_link = del_from_left($src_link, strlen($host));
                    $full_link = $src_link;
                } else {
                    //ссылка совсем абсолютная и ведет наружу - обрезаем
                    $cd_link = 'index.html';
                    $full_link = '';
                }
            } elseif (substr($src_link, 0, strlen('../images/')) == '../images/') {
                $src_link = substr($src_link, strlen('../'));
                $cd_link = $clean_url . $src_link;
                $full_link = $host . $cd_link;
            } else {
                //ссылка относительная, подставляем рабочий каталог
                $cd_link = $clean_url . $src_link;
                $full_link = $host . $cd_link;
            }
            if (strpos($url, '.css') !== false) {
                // Заменяем в css-файле пути к картинкам с /images на ../images
                if (first_char($src_link) == '/') {
                    $cd_link = '/..' . $src_link;
                    $full_link = $host . $src_link;
                } else {
                    if (substr($src_link, 0, strlen('images/')) == 'images/') {
                        $cd_link = '/../' . $src_link;
                        $full_link = $host . '/' . $src_link;
                    }
                }
            }
            //echo $cd_link."\n";
            //проверяем куда эта ссылка - если на файл - добавляем в список файлов на закачкуы
            $need = false;
            $is_cd = "";
            if ($cd_link != '#') {
                if (strpos($cd_link, 'popup.php') !== false) {
                } else {
                    foreach ($download_file_sufix as $suf) {
                        if (if_sufix($cd_link, $suf)) {
                            $result->download_name[] = $cd_link;
                            $result->download_link[] = $full_link;
                            $need = true;
                            $cd_link = del_from_left($cd_link, 1);
                        }
                    }
                    foreach ($parse_file_sufix as $suf) {
                        if (if_sufix($cd_link, $suf)) {
                            $result->parse_name[] = $cd_link;
                            $result->parse_link[] = $full_link;
                            $need = true;
                            $cd_link = del_from_left($cd_link, 1);
                        }
                    }
                }
                if (!$need) {
                    if (substr($src_link, 0, 3) == "/cd") {
                        $src_link = substr($src_link, 3);
                        $is_cd = "/cd";
                    }
                    if (substr($src_link, 0, 2) == "cd") {
                        $src_link = substr($src_link, 2);
                        $is_cd = "cd";
                    }
                    if (substr($src_link, 0, 1) == "/") {
                        $src_link = substr($src_link, 1);
                    }
                    if (substr($cd_link, 0, 3) == "cd/") {
                        $cd_link = substr($cd_link, 3);
                    }
                    if (substr($cd_link, 0, 3) == "/cd") {
                        $cd_link = substr($cd_link, 3);
                    }
                    if ($cd_link == "/") {
                        $cd_link = "index.html";
                    } else {
                        $match = false;
                        if (strpos($cd_link, 'popup.php') !== false) {
                            $match = true;
                        } else {
                            $cur_id = id_by_path($cd_link);
                            if ($cur_id && in_array($cur_id, $id_array)) {
                                $match = true;
                            }
                        }
                        // Если это ссылка с параметрами (и эта ссылка включена в презентацию), то получаем и ее тоже в отдельный файл, а ссылку переименовываем по имени файла
                        if (strpos($src_link, '?') !== false) {
                            $_temp = explode('?', $src_link);
                            $cur_id = id_by_path($_temp[0]);
                            if (strpos($cd_link, 'popup.php') !== false || $cur_id && in_array($cur_id, $id_array)) {
                                mysql_query("insert into tree_cd_links (url,done) values ('{$src_link}',0)");
                                $match = true;
                            }
                        }
                        //echo $cd_link." -->";
                        if (!$match) {
                            $cd_link = '#';
                        } else {
                            if ($cd_link[0] == '/') {
                                $cd_link = substr($cd_link, 1);
                            }
                            $cd_link = str_replace(array('?', '/'), '_', $cd_link);
                            if (substr($cd_link, -1) == '_') {
                                $cd_link = substr($cd_link, 0, strlen($cd_link) - 1);
                            }
                            $cd_link .= ".html";
                        }
                        //echo $cd_link." ($match) \r\n";
                    }
                    if (!if_prefix($cd_link, "javascript")) {
                        $result->href_name[] = $cd_link;
                        $result->href_link[] = $full_link;
                    }
                    //fputs($log_file,$cd_link."  ====>>>> $match<br>");
                }
            }
            if (strlen($current_sep) == 2) {
                $link_in_code = first_char($current_sep) . $src_link . last_char($current_sep);
                $new_link_in_code = first_char($current_sep) . $cd_link . last_char($current_sep);
            } else {
                $link_in_code = $src_link . $current_sep;
                $new_link_in_code = $cd_link . $current_sep;
            }
            if (!isset($is_cd)) {
                $is_cd = '';
            }
            if ($is_cd) {
                $link_in_code = $is_cd . $link_in_code;
            }
            $tmp = del_from_left($buff[$i], strlen($link_in_code));
            if ($tmp[0] == '"' || $tmp[0] == "'") {
                $tmp = substr($tmp, 1);
            }
            $buff[$i] = $new_link_in_code . $tmp;
            $text = implode($href_name, $buff);
        }
    }
    $result->text = $text;
    return $result;
}
コード例 #2
0
ファイル: process_pages.php プロジェクト: romlg/cms36
function go_inside_www($f, $url, $host, $text)
{
    $result = new go_inside_www_result();
    $sufix = array(".html", ".htm", ".php");
    $file_sufix = array(".jpg", ".jpeg", ".gif", ".zip", ".rar", ".doc", ".xls", ".avi", ".mpg", ".mpeg", ".txt", ".rtf", ".png", ".tga", ".psd", ".pdf", ".swf", ".css");
    $f_new = $f;
    if (substr($url, strlen($url) - 1, 1) == "/") {
        $new_url = del_from_right($url);
    } else {
        $new_url = $url;
    }
    foreach ($sufix as $str) {
        if (substr($url, strlen($url) - strlen($str), strlen($str)) == $str) {
            $new_url = $url;
            for ($i = strlen($url) - 1; $i >= 0; $i--) {
                if (substr($new_url, $i, 1) == '/') {
                    $a = $i;
                    $i = -1;
                }
            }
            $new_url = substr($new_url, 0, $a);
        }
    }
    echo "{$new_url}\n\n";
    //echo $new_url."/<br>";
    if (substr($new_url, strlen($new_url) - 1, 1) != '/') {
        $new_url = $new_url . "/";
    }
    if (strpos($url, '?')) {
        //echo "<div style='color: red;'>? found in url!!</div>";
        die;
    }
    $old_f = $f;
    //echo "<b>обрабатываем ".$url."</b><hr>";
    $buff = explode($text, $f);
    //echo sizeof($buff)." сцылок найденно<hr>";
    $new_buff[0] = $buff[0];
    for ($i = 1; $i < sizeof($buff); $i++) {
        //echo "сцылка №".$i."=>  \n";
        $tmp1 = $buff[$i];
        $first = substr($tmp1, 0, 1);
        if ($first == '"') {
            $sep = '"';
            $tmp2 = substr($tmp1, 1, strlen($tmp1) - 1);
        } elseif ($first == "'") {
            $sep = "'";
            $tmp2 = substr($tmp1, 1, strlen($tmp1) - 1);
        } elseif ($first == "(") {
            $sep = ")";
            $tmp2 = del_from_left($tmp1);
        } else {
            $sep = ' ';
            if (strpos($tmp1, '>') < strpos($tmp1, ' ')) {
                $sep = '>';
            }
            $tmp2 = $tmp1;
        }
        if (substr(${$tmp2}, 0, 11) != "javascript:") {
            $tmp3 = explode($sep, $tmp2);
            $link = $tmp3[0];
            //echo $link;
            //elseif (substr($link,0,1)=='/'){
            //echo "absolute link: ".$link." ===> ".$new_link."\n";
            if (substr($link, 0, 7) == 'http://') {
                $new_link = $link;
            } else {
                if (substr($link, 0, 1) != '/') {
                    $new_link = $host . "/" . $link;
                } else {
                    $new_link = $host . $link;
                }
                //$new_link=$new_url.$link;
                //echo "relative link $link ===> $new_link \n";
            }
            if (substr($new_link, 0, strlen($host)) == $host) {
                $cd_link = substr($new_link, strlen($host), strlen($new_link) - strlen($host));
                //echo $link." => ".$cd_link."<br>";
            } else {
                //	echo $link." => сцылка наружу - будем бить, возможно даже ногами";
                $cd_link = $link;
            }
            //echo $cd_link."===";
            $need = false;
            foreach ($file_sufix as $file_end) {
                //echo substr($cd_link,strlen($cd_link)-strlen($file_end),strlen($file_end))."==".$file_end."<br>";
                if (strtolower(substr($cd_link, strlen($cd_link) - strlen($file_end), strlen($file_end))) == $file_end) {
                    $need = true;
                    //echo "need ".$cd_link;
                }
            }
            //if ((substr($cd_link,0,1)!='/')&&substr($cd_link,0,7)!="http://") {
            //	echo $cd_link."\n";
            //	$cd_link='/'.$cd_link;
            //}
            //if($cd_link=='images/main_header_03.gif'){
            //	echo "\n!!!!!!!!!!!!!!\n";
            //}
            if ($need) {
                $result->need_name[] = $cd_link;
                $result->need_link[] = $new_link;
            }
            // обратная сборка
            $tmp3[0] = $cd_link;
            $tmp2 = implode($sep, $tmp3);
            if ($sep == '"' || $sep == "'") {
                $tmp1 = $sep . $tmp2;
            } elseif ($sep == ')') {
                $tmp1 = '(' . $tmp2;
            }
            $new_buff[$i] = $tmp1;
            //echo "<hr>link looks like <b>$link</b> and resolved as $new_link<hr>";
            $f_new = str_replace($link . $sep, $cd_link . $sep, $f_new);
        } else {
            //echo "javascript link\n";
        }
        //echo "<hr>\n";
    }
    $result->str = implode($text, $new_buff);
    //$result->str=$f_new;
    //show_html($f_new);
    $buff = explode('<script', $result->str);
    for ($i = 1; $i < sizeof($buff); $i++) {
        $tmp = explode('</script>', $buff[$i]);
        $buff[$i] = $tmp[1];
    }
    $result->str = implode('', $buff);
    return $result;
}