1. Вы находитесь в архивной версии форума xaker.name. Здесь собраны темы с 2007 по 2012 год, большинство инструкций и мануалов уже неактуальны.
    Скрыть объявление

Полезные функции, классы

Тема в разделе "PHP, Perl, web-программирование", создана пользователем b3, 15 авг 2009.

  1. b3

    b3 Продвинутый

    Регистрация:
    8 окт 2007
    Сообщения:
    142
    Симпатии:
    104
    Баллы:
    0
    Выкладываем функции и классы которые облегчат нашу участь в программировании.

    Стартую первый.
    Погода на weather.bigmir.net

    PHP:
    <?php 
    class weather 

    ######################################## 

    # Погода на weather.bigmir.net 

    ######################################## 
    var $url 'http://weather.bigmir.net/main/harkov/8956/'

    var 
    $celsius 'N\A'
    var 
    $windspeed 'N\A'
    var 
    $vlaga 'N\A'
    var 
    $visibility 'N\A'
    var 
    $obl 'N\A'
    var 
    $date 'N\A'
    var 
    $city 'N\A'

    function 
    weather() 

    $url file_get_contents($this->url); 

    if(preg_match('#<span id=\'TemperatureCelsius\'>(.*)<\/span>#',$url,$matches)) 
    $this->celsius $matches[1]; 

    if(
    preg_match('#<span id=\'WindSpeed\'>(.*)<\/span>#U',$url,$matches)) 
    $this->windspeed $matches[1].'м/с'

    if(
    preg_match('#<span id=\'RelativeHumidity\'>(.*)<\/span>#U',$url,$matches)) 
    $this->vlaga $matches[1].'%'

    if(
    preg_match('#<span id=\'VisibilityKM\'>(.*)<\/span>#U',$url,$matches)) 
    $this->visibility $matches[1].'км'

    if(
    preg_match('#<span id=\'CloudCoverage\'>(.*)</span>#U',$url,$matches)) 
    $this->obl $matches[1].'%'

    if(
    preg_match('#<span id=\'forecastDate\'>(.*?)</span>#U',$url,$matches)) 
    $this->date 'Погода на '.$matches[1]; 

    if(
    preg_match('#<div class="fl mrt_small">Погода в (.*)<\/div>#U',$url,$matches)) 
    $this->city 'В '.$matches[1]; 



    $a = new weather
    echo 
    $a->city.'<br />'
    echo 
    $a->date.'<br />'
    echo 
    'Температура '.$a->celsius.'<br />'
    echo 
    'Скорость ветра '.$a->windspeed.'<br />'
    echo 
    'Влажность '.$a->vlaga.'<br />'
    echo 
    'Видимость '.$a->visibility.'<br />'
    echo 
    'Облачность '.$a->obl.'<br />'
    ?>

    Если вы привыкли задавать цвет так, как это делается в HTML, то можете использовать следующую функцию:

    PHP:
    <?php
    function htmlcolor($img,$color) {
        
    sscanf($color"%2x%2x%2x"$red$green$blue);
        return 
    ImageColorAllocate($img,$red,$green,$blue);
        return(
    $c);
        }

    $red=htmlcolor($img,"FF0000");
    ?>
    Парсим куки:

    PHP:
    <?php
    function pregCookie($headers)
        {
            
    preg_match_all('#Set-cookie: (.*;)#UiS',$headers,$headers);
            return 
    implode('',$headers['1']);
        }
    Упаковка файла:

    PHP:
    <?php
    function pack_php($file
        { 
            if (!
    file_exists($file) or !is_readable($file)) 
            { 
                die(
    'The file could not be found. Trying to hack yourself? 0_o'); 
            } 
             
            
    $code bzcompress('?>'shell_exec('php -nw '$file), 9); 
            
    $output_fname dirname($file). '/'basename($file'.php'). '_bz.php'
            
    $output fopen($output_fname'w'); 
             
            
    fputs($output'<?php $f=fopen(__FILE__,\'r\');'
                
    'fseek($f,133);$c=\'\';'
                
    'while (!feof($f)){$c.=fread($f,1024);}'
                
    'eval(bzdecompress($c));'
                
    '__halt_compiler(); ?>'"\n"chr(0)); 
            
    fputs($output$code); 
            
    fclose($output); 
            
    chmod($output_fname0777); 
             
            echo 
    "done.\n"
            
    $before filesize($file); 
            
    $after filesize($output_fname); 
            echo 
    '> Before compress : '. ($before 1024). " Kb\n"
            echo 
    '> After compress  : '. ($after 1024). " Kb\n"
            echo 
    '> Compress ratio  : '. (($before $after) * 100) / $before"%\n"
        }
    ?>
     
    1 человеку нравится это.
  2. b3

    b3 Продвинутый

    Регистрация:
    8 окт 2007
    Сообщения:
    142
    Симпатии:
    104
    Баллы:
    0
    Определение кодировки текста
    PHP:
    <?
    define('LOWERCASE',3);
    define('UPPERCASE',1);

    function 
    detect_cyr_charset($str) {
        
    $charsets = Array(
                          
    'k' => 0,
                          
    'w' => 0,
                          
    'd' => 0,
                          
    'i' => 0,
                          
    'm' => 0
                          
    );
        for ( 
    $i 0$length strlen($str); $i $length$i++ ) {
            
    $char ord($str[$i]);
            
    //non-russian characters
            
    if ($char 128 || $char 256) continue;
            
            
    //CP866
            
    if (($char 159 && $char 176) || ($char 223 && $char 242)) 
                
    $charsets['d']+=LOWERCASE;
            if ((
    $char 127 && $char 160)) $charsets['d']+=UPPERCASE;
            
            
    //KOI8-R
            
    if (($char 191 && $char 223)) $charsets['k']+=LOWERCASE;
            if ((
    $char 222 && $char 256)) $charsets['k']+=UPPERCASE;
            
            
    //WIN-1251
            
    if ($char 223 && $char 256$charsets['w']+=LOWERCASE;
            if (
    $char 191 && $char 224$charsets['w']+=UPPERCASE;
            
            
    //MAC
            
    if ($char 221 && $char 255$charsets['m']+=LOWERCASE;
            if (
    $char 127 && $char 160$charsets['m']+=UPPERCASE;
            
            
    //ISO-8859-5
            
    if ($char 207 && $char 240$charsets['i']+=LOWERCASE;
            if (
    $char 175 && $char 208$charsets['i']+=UPPERCASE;
            
        }
        
    arsort($charsets);
        return 
    key($charsets);
    }
    ?>
     
  3. b3

    b3 Продвинутый

    Регистрация:
    8 окт 2007
    Сообщения:
    142
    Симпатии:
    104
    Баллы:
    0
    Антикапча Класс
    PHP:
    <?php

    class AntiCaptcha {
        const 
    FILE_NOT_FOUND 0;
        const 
    CURL_ERROR 1;
        const 
    SERVER_ERROR 2;
        const 
    TIMEOUT 3;
        
        public 
    $key;
        public 
    $server 'http://ac-service.info';
        public 
    $phrase false;
        public 
    $regsense false;
        public 
    $numeric false;
        public 
    $min_len 0;
        public 
    $max_len 0;
        
        public 
    $ocr_step_time 10;
        public 
    $ocr_timeout 120;
        
        public 
    $curl_timeout 30;
        
        private 
    $id;
        
        function 
    __construct($key) {
            
    $this->key $key;
        }
        
        function 
    recognize($filename) {
            if (!
    file_exists($filename)) {
                throw new 
    Exception('File not found',self::FILE_NOT_FOUND);
            }
            
    $postdata = array(
                
    'method'    => 'post'
                
    'key'       => $this->key
                
    'file'      => '@'.realpath($filename),
                
    'phrase'    => (int)$this->phrase,
                
    'regsense'    => (int)$this->regsense,
                
    'numeric'    => (int)$this->numeric,
                
    'min_len'    => $this->min_len,
                
    'max_len'    => $this->max_len,
                
            );
            
    $curl curl_init();
            
    curl_setopt($curlCURLOPT_URL$this->server.'/in.php');
            
    curl_setopt($curlCURLOPT_RETURNTRANSFER1);
            
    curl_setopt($curlCURLOPT_TIMEOUT$this->curl_timeout);
            
    curl_setopt($curlCURLOPT_POST1);
            
    curl_setopt($curlCURLOPT_POSTFIELDS$postdata);
            
    $result curl_exec($curl);
            if (
    curl_errno($curl)) {
                throw new 
    Exception(curl_error($curl),self::CURL_ERROR);
            }
            
    curl_close($curl);
            if (
    strpos($result'OK') === 0) {
                list(,
    $this->id) = explode('|',$result);
                
    $start time();
                while (
    true) {
                    
    sleep($this->ocr_step_time);
                    
    $curl curl_init();
                    
    curl_setopt($curlCURLOPT_URL$this->server.'/res.php?key='.$this->key.'&action=get&id='.$this->id);
                    
    curl_setopt($curlCURLOPT_RETURNTRANSFERtrue);
                    
    curl_setopt($curlCURLOPT_TIMEOUT$this->curl_timeout);
                    
    $result curl_exec($curl);
                    if (
    curl_errno($curl)) {
                        throw new 
    Exception(curl_error($curl),self::CURL_ERROR);
                    }
                    
    curl_close($curl);
                    if (
    strpos($result'OK') === 0) {
                        list(,
    $result) = explode('|',$result);
                        return 
    $result;
                    } else if (
    $result == 'CAPCHA_NOT_READY') {
                        if ((
    time() - $start) > $this->ocr_timeout) {
                            throw new 
    Exception("OCR timeout",self::TIMEOUT);
                        }
                    }
                }
            } else {
                throw new 
    Exception($result,self::SERVER_ERROR);
            }
        }
    }

    ?>
    Мультикурл Класс

    PHP:
    <?php
    /**
     * MultiCurl class library is a PHP solution for work with MULTI CURL extension.
     * It provides to execute some parallel HTTP requests with limit of downloaded
     * size. Example: start 100 downloads with 2 parallel sessions, and get only
     * first 100 Kb per session.
     *
     * This library is free software; you can redistribute it and/or
     * modify it under the terms of the GNU Lesser General Public
     * License as published by the Free Software Foundation; either
     * version 3.0 of the License, or (at your option) any later version.
     *
     * This library is distributed in the hope that it will be useful,
     * but WITHOUT ANY WARRANTY; without even the implied warranty of
     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
     * See the GNU Lesser General Public License for more details.
     *
     * @author    Vadym Timofeyev <[email protected]> http://weblancer.net/users/tvv/
     * @copyright 2007 Vadym Timofeyev
     * @license   http://www.gnu.org/licenses/lgpl-3.0.txt
     * @version   1.06
     * @since     PHP 5.0
     * @example   examples/example.php How to use MultiCurl class library.
     */
    abstract class MultiCurl {
        
    /**
         * Maximal number of CURL multi sessions, 10 sessions by default
         * @var integer
         */
        
    private $maxSessions 10;

        
    /**
         * Maximal size limit for downloaded content, 10 Mb (10 * 1024 * 1024) by default
         * @var integer
         */
        
    private $maxSize 10485760;

        
    /**
         * CURL options for all requests
         * @var array
         */
        
    private $curlOptions;

        
    /**
         * Current CURL multi sessions
         * @var array
         */
        
    private $sessions = array();

        
    /**
         * Class constructor. Setup primary parameters.
         * @param array $curlOptions CURL options for all URLs
         */
        
    public function __construct($curlOptions = array()) {
            
    // Set CURL options for all URLs
            
    $this->setCurlOptions($curlOptions);
        }

        
    /**
         * Class destructor. Close opened sessions.
         */
        
    public function __destruct() {
            foreach (
    $this->sessions as $i => $sess) {
                
    $this->destroySession($i);
            }
        }

        
    /**
         * Add new URL to query
         * @param mixed $url URL for downloading
         * @param array $curlOptions CURL options for current request
         */
        
    public function addUrl($url$curlOptions = array()) {
            
    // Check URL
            
    if (!$url) {
                throw new 
    Exception('URL is empty!');
            }

            
    // Check array of URLs
            
    if (is_array($url)) {
                foreach (
    $url as $s) {
                    
    $this->addUrl($s$curlOptions);
                }
                return;
            }

            
    // Check query
            
    while (count($this->sessions) == $this->maxSessions) {
                
    $this->checkSessions();
            }

            
    // Init new CURL session
            
    $ch curl_init($url);
            foreach (
    $this->curlOptions as $option => $value) {
                
    curl_setopt($ch$option$value);
            }
            foreach (
    $curlOptions as $option => $value) {
                
    curl_setopt($ch$option$value);
            }

            
    // Init new CURL multi session
            
    $mh curl_multi_init();
            
    curl_multi_add_handle($mh$ch);
            
    $this->sessions[] = array($mh$ch$url);
            
    $this->execSession(array_pop(array_keys($this->sessions)));
        }

        
    /**
         * Wait CURL milti sessions
         */
        
    public function wait() {
            while (
    count($this->sessions)) {
                
    $this->checkSessions();
            }
        }

        
    /**
         * Execute all active CURL multi sessions
         */
        
    protected function checkSessions() {
            foreach (
    $this->sessions as $i => $sess) {
                if (
    curl_multi_select($sess[0]) != -1) {
                    
    $this->execSession($i);
                }
            }
        }

        
    /**
         * Execute CURL multi session, сheck session status and downloaded size
         * @param integer $i A session id from array $this->sessions
         */
        
    protected function execSession($i) {
            list(
    $mh$ch,) = $this->sessions[$i];

            while ((
    $mrc curl_multi_exec($mh$active)) == CURLM_CALL_MULTI_PERFORM);
            if (!
    $active || $mrc != CURLM_OK || curl_getinfo($chCURLINFO_SIZE_DOWNLOAD) >= $this->maxSize) {
                
    $this->closeSession($i);
            }
        }

        
    /**
         * Close session
         * @param integer $i A session id from array $this->sessions
         */
        
    protected function closeSession($i) {
            list(, 
    $ch$url) = $this->sessions[$i];
            
    $content = !curl_error($ch) ? curl_multi_getcontent($ch) : null;
            
    $info curl_getinfo($ch);    
            
    $this->destroySession($i);
            
    $this->onLoad($url$content$info);
        }

        
    /**
         * Destroy session
         * @param integer $i A session id from array $this->sessions
         */
        
    protected function destroySession($i) {
            list(
    $mh$ch,) = $this->sessions[$i];
            
    curl_multi_remove_handle($mh$ch);
            
    curl_close($ch);
            
    curl_multi_close($mh);
            unset(
    $this->sessions[$i]);
        }

        
    /**
         * Get maximal number of CURL multi sessions
         * @return integer Maximal number of CURL multi sessions
         */
        
    public function getMaxSessions() {
            return 
    $this->maxSessions;
        }

        
    /**
         * Set maximal number of CURL multi sessions
         * @param integer $maxSessions Maximal number of CURL multi sessions
         */
        
    public function setMaxSessions($maxSessions) {
            if ((int)
    $maxSessions <= 0) {
                throw new 
    Exception('Max sessions number must be bigger then zero!');
            }
            
    $this->maxSessions = (int)$maxSessions;
        }

        
    /**
         * Get maximal size limit for downloaded content
         * @return integer Maximal size limit for downloaded content
         */
        
    public function getMaxSize() {
            return 
    $this->maxSize;
        }

        
    /**
         * Set maximal size limit for downloaded content
         * @param integer $maxSize Maximal size limit for downloaded content
         */
        
    public function setMaxSize($maxSize) {
            if ((int)
    $maxSize <= 0) {
                throw new 
    Exception('Max size limit must be bigger then zero!');
            }
            
    $this->maxSize = (int)$maxSize;
        }

        
    /**
         * Get CURL options for all requests
         * @return array CURL options
         */
        
    public function getCurlOptions() {
            return 
    $this->curlOptions;
        }

        
    /**
         * Set CURL options for all requests
         * @param array $curlOptions CURL options
         */
        
    public function setCurlOptions($curlOptions) {
            if (!
    array_key_exists(CURLOPT_FOLLOWLOCATION$curlOptions)) {
                
    $curlOptions[CURLOPT_FOLLOWLOCATION] = 1;
            }
            
    $curlOptions[CURLOPT_RETURNTRANSFER] = 1;
            
    $curlOptions[CURLOPT_TIMEOUT] = 5;
            
    $this->curlOptions $curlOptions;
        }

        
    /**
         * OnLoad callback event
         * @param string $url URL for downloading
         * @param string $content Downloaded content
         * @param array $info CURL session information
         */
        
    protected abstract function onLoad($url$content$info);

        
    /**
         * Check CURL extension, etc.
         */
        
    public static function checkEnvironment() {
            if (!
    extension_loaded('curl')) {
                throw new 
    Exception('CURL extension not loaded');
            }
        }
    }
    ?>
    Класс для постраничного вывода из БД (новостей и тд...)

    PHP:
    <?php
    class Paging {

    private 
    $page_size 10;
    private 
    $link_padding 10;
    private 
    $page_link_separator ' ';
    private 
    $next_page_text 'следующая >';
    private 
    $prev_page_text '< предыдущая';
    private 
    $result_text_pattern 'Показано с %s по %s из %s';
    private 
    $page_var 'p';

    private 
    $db;
    private 
    $q;
    private 
    $total_rows;
    private 
    $total_pages;
    private 
    $cur_page;

    public function 
    __construct($db$q=''$page_var='p')
    {
        
    $this->db $db;
        if (
    $q$this->set_query($q);
        
    $this->page_var $page_var;
        
    $this->cur_page = isset($_GET[$this->page_var]) && (int)$_GET[$this->page_var] > ? (int)$_GET[$this->page_var] : 1;
    }

    public function 
    set_query($q)
    {
        
    $this->$q;
    }

    public function 
    set_page_size($page_size)
    {
        
    $this->page_size abs((int)$page_size);
    }

    public function 
    set_link_padding($padding)
    {
        
    $this->link_padding abs((int)$padding);
    }

    public function 
    get_page($q='')
    {
        if (
    $q$this->set_query($q);

        
    $r $this->db->query$this->query_paging($this->q) );
        
    $this->total_rows array_pop($this->db->query('SELECT FOUND_ROWS()')->fetch_row());

        if (
    $this->page_size !== 0$this->total_pages ceil($this->total_rows/$this->page_size);
        
        if (
    $this->cur_page $this->total_pages)
        {
            
    $this->cur_page $this->total_pages;
            if ( 
    $this->total_pages $r $this->db->query$this->query_paging($this->q) );
        }
        
        return 
    $r;
    }

    public function 
    get_result_text()
    {
        
    $start = (($this->cur_page-1) * $this->page_size)+1;
        
    $end = (($start-1+$this->page_size) >= $this->total_rows)? $this->total_rows:($start-1+$this->page_size);

        return 
    sprintf($this->result_text_pattern$start$end$this->total_rows);
    }

    public function 
    get_page_links()
    {
        if ( !isset(
    $this->total_pages) ) return '';

        
    $page_link_list = array();

        
    $start $this->cur_page $this->link_padding;
        if ( 
    $start $start 1;
        
    $end $this->cur_page $this->link_padding-1;
        if ( 
    $end $this->total_pages $end $this->total_pages;

        if ( 
    $start )  $page_link_list[] = $this->get_page_link$start-1$start '...' '' );
        for (
    $i=$start$i <= $end$i++)  $page_link_list[] = $this->get_page_link$i );
        if ( 
    $end $this->total_pages $page_link_list[] = $this->get_page_link$end +1$end == $this->total_pages '' '...' );
        if ( 
    $end <= $this->total_pages $page_link_list[] = $this->get_page_link$this->total_pages );

        return 
    implode($this->page_link_separator$page_link_list);
    }

    public function 
    get_next_page_link()
    {
        return isset(
    $this->total_pages) && $this->cur_page $this->total_pages $this->get_page_link$this->cur_page 1$this->next_page_text ) : '';
    }

    public function 
    get_prev_page_link()
    {
        return isset(
    $this->total_pages) && $this->cur_page $this->get_page_link$this->cur_page 1$this->prev_page_text ) : '';
    }

    private function 
    get_page_link($page$text='')
    {
        if (!
    $text)    $text $page;

        if (
    $page != $this->cur_page)
        {
            
    $reg '/((&|^)'.$this->page_var.'=)[^&#]*/';
            
    $url '?'.( preg_match$reg$_SERVER['QUERY_STRING'] ) ? preg_replace($reg'${1}'.$page$_SERVER['QUERY_STRING']) : ( $_SERVER['QUERY_STRING'] ? $_SERVER['QUERY_STRING'].'&' '' ).$this->page_var.'='.$page);
            return 
    '<a href="'.$url.'">'.$text.'</a>';
        }
        return 
    '<span>'.$text.'</span>';
    }

    private function 
    query_paging()
    {
        
    $q $this->q;

        if (
    $this->page_size != 0)
        {
            
    //calculate the starting row
            
    $start = ($this->cur_page-1) * $this->page_size;
            
    //insert SQL_CALC_FOUND_ROWS and add the LIMIT
            
    $q preg_replace('/^SELECT\s+/i''SELECT SQL_CALC_FOUND_ROWS '$this->q)." LIMIT {$start},{$this->page_size}";
        }

        return 
    $q;
    }
    }
    ?>
     
    2 пользователям это понравилось.
  4. Anvil

    Anvil Мягкий и пушистый! ..::V.I.P::..

    Регистрация:
    5 авг 2007
    Сообщения:
    194
    Симпатии:
    79
    Баллы:
    0
    Порывшись у себя на компе, нашел класс который когда то давно писал для одного человека. Класс служит для предварительной проверки бина кредитки на валидность, она не проверит существует ли эта карта в реальности и есть ли на ней баланс. Проверяет лишь бин на соответствие алгоритму генерации.

    в виде класса, если куда то встраивать в систему (зачастую в больших системах ООП):
    PHP:
    class valid 
      
    {   
        function 
    valid_cc_id($cc)
        {                       
           if (
    strspn($cc"0123456789") != strlen($cc)) {
              return 
    false;
           }
           
    $map = array(0123456789,
                        
    0246813579);
           
    $sum 0;
           
    $last strlen($cc) - 1;
           for (
    $i 0$i <= $last$i++) {
              
    $sum += $map[$cc[$last $i] + ($i 1) * 10];
           }
           return 
    $sum 10 == 0;
        }
      }

    // пример использования
    $test_cc "4271783702093845";
    $obj = new valid();
    if (
    $obj->valid_cc_id($test_cc) == 1)
    {
        echo 
    "Карта валид";    
    } else 
    {
        echo 
    "Карта не валид";     
    }
     
    1 человеку нравится это.

Поделиться этой страницей