На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Дополнения к правилам (только для данного раздела)
- Используйте подсветку синтаксиса при выделении исходного кода;
- В описании темы обязательно укажите язык программирования;
- Прежде чем задать вопрос, обязательно воспользуйтесь поиском и загляните в FAQ раздела.
- Если вопрос касается серверного ПО, указывайте ОС.
- Если вопрос касается ASP.NET то лучше будет задать его в соответствующем разделе. Там вы сможете получить ответ намного быстрее.

Модераторы: Serafim, fatalist
Закрыто Рысь 29-05-2007:
  
> Наша Лаборатория
    Если Вы хотите что-либо добавить или Вам что-либо не нравится - пишите сюда

    Функция инициализирования переменной

    Язык: РНР
    Автор: Rom@nych


    Функция инициализирует переменную из данных GET, POST запроса или берёт её из сессионных данных. Принимает два параметра. Первый - строка - имя переменной, второй - значение, которое передастся переменной в случае, если она не может быть найдена. По умолчанию пустая строка.
    Пример вызова:
    ExpandedWrap disabled
      ini('action', 'none')
    В результате выполнения этого кода будет проинициализирована переменная $action в случае, если она не содержится в массивах $_POST, $_GET, $_SESSION она будет равна 'none'
    При выборе массива идёт проверка в следующем порядке $_POST, $_GET, $_SESSION

    Это сообщение было перенесено сюда или объединено из темы "Наша лаборатория"
    Прикреплённый файлПрикреплённый файлini.php (0.61 Кбайт, скачиваний: 1272)
      Mailpost Server

      Скрипт для отправки файлов по почте непосредственно из интернета.


      Язык: PHP (серверная часть), Free Pascal (клиентская)
      Автор: Trustmaster & Argentum


      Скрипт полезен в том случае, если вы имеете почтовый ящик с неограниченным трафиком. Серверный скрипт располагается на вашем хостинге и предоставляет форму, в которой вы вводите URL нужного файла. После этого файл будет отправлен на ваш e-mail. Если размер файла превышает определенный лимит (по умолчанию 4МБ), он будет отправлен по частям, соединить которые можно при помощи клиентской программы. Подробную инструкцию читайте в README.

      Это сообщение было перенесено сюда или объединено из темы "Наша лаборатория"
      Прикреплённый файлПрикреплённый файлmailpost.zip (19.77 Кбайт, скачиваний: 1303)
        Функция создания Pages Bar

        Язык: PHP
        Автор: Kheor aka DUKe


        исправлены ошибки: 24/10/2007. Отдельное и больше спасибо Лёхе

        Функция создает что-то типа оглавления когда нужен постраничный вывод, например, у нас есть 23 страницы и выбрана 11ая страница (номер страницы передается методом get, параметром page). Тогда, чтобы создать оглавление вызываем:
        ExpandedWrap disabled
          echo generatePagesBar(11, 23, "<a href='%PARAM_PAGE%'>%PARAM_PAGE%</a> ");


        В результате имеем:
        ExpandedWrap disabled
          <a href = 'http://www.someplace.ru/somepage.php?page=1'>1</a>,
          <a href = 'http://www.someplace.ru/somepage.php?page=2'>2</a>,
          <a href = 'http://www.someplace.ru/somepage.php?page=3'>3</a> ...
          <a href = 'http://www.someplace.ru/somepage.php?page=10'>10</a>,
          <a href = 'http://www.someplace.ru/somepage.php?page=11'>11</a>,
          <a href = 'http://www.someplace.ru/somepage.php?page=12'>12</a> ...
          <a href = 'http://www.someplace.ru/somepage.php?page=21'>21</a>,
          <a href = 'http://www.someplace.ru/somepage.php?page=22'>22</a>,
          <a href = 'http://www.someplace.ru/somepage.php?page=23'>23</a>


        Это сообщение было перенесено сюда или объединено из темы "Наша лаборатория"
        Сообщение отредактировано: Рысь -

        Прикреплённый файлПрикреплённый файлpagesBar_update.zip (0.77 Кбайт, скачиваний: 1129)
          Плагин для системы Smarty

          Язык: РНР
          Автор: Rom@nych
          Тип: modifier


          Этот модификатор позволяет подсвечивать ссылки в тексте. Возможности: поиск всех ссылок в тексте на сайты и e-mail'ы. если в ссылке указан хост сайта, то он будет открыт в новом окне, иначе - в том же. Также принимает аттрибут extras, который позволяет вставлять в ссылку доп. аттрибуты.
          Использование:
          ExpandedWrap disabled
            {$var|hrefs:'class="link"'}

          Установка: скопировать файл в каталог plugins системы Smarty

          Это сообщение было перенесено сюда или объединено из темы "Наша лаборатория"
          Прикреплённый файлПрикреплённый файлmodifier.hrefs.php (1.48 Кбайт, скачиваний: 1203)
            Безопасные Сессии

            Замещенный механизм, хранящий данные сессии в БД.


            Язык: PHP
            Автор: Trustmaster


            Слабость стандартного механизма сессий PHP заключается в том, что сами данные сессии хранятся в виде файлов, доступных для чтения и записи любому желающему. Скрипт session_thief.php наглядно показывает, как эти данные можно извлечь.

            PHP позволяет замещать многие из его механизмов. Данный вариант замещенного механизма сессий PHP использует базы данных. Таким образом, вы можете создать единую таблицу для всех сессий в системе, но лучше, чтобы каждый сайт имел собственную таблицу сессий, что обеспечит большую конфиденциальность и даст вам дополнительные возможности. Например, вы сможете с легкостью узнать, сколько пользователей находятся в режиме OnLine, просто подсчитав количество валидных записей в таблице. Кроме того, вы сами можете модифицировать этот механизм под свои нужды, добавив, например, промежуточное шифрование данных (что не есть обязательно, если вы не раздаете свой пароль от mySQL каждому встречному-поперечному).

            Кроме того, этот вариант использует библиотеку SQLDB, поэтому он будет работать на MySQL, MSSQL и PostgreSQL.

            Это сообщение было перенесено сюда или объединено из темы "Наша лаборатория"
            Прикреплённый файлПрикреплённый файлsessions.zip (6.7 Кбайт, скачиваний: 1279)
              Коллектор ТВ-программ

              Автор: Tishaishii

              А это затравка для разработки менеджмента телепрограммами.
              Подворовываются с www.rambler.ru. Жаль, только ресурсы кушает много (зато один раз на всю неделю), но без этого никак.

              Это сообщение было перенесено сюда или объединено из темы "Наша лаборатория"
              Сообщение отредактировано: Mastilior -

              Прикреплённый файлПрикреплённый файлtv.zip (38.92 Кбайт, скачиваний: 1220)
                Программа кружка про создание www-приложений. Тема: "Базовые конструкции языка программирования Perl".

                Автор: Tishaishii

                Решил в институте открыть кружок "Золотая, смелая и умелая клавиатура, да гибкие пальчики" или "Бодрая мышка с нарушкой" про www-мастерство. Декан одобрил и деньги предложил. Идея хорошая.
                Вот здесь (в пакетике) материалы по нему самому (по кружку "Золотая, смелая и умелая клавиатура, да гибкие пальчики").
                Краткое описание 13 лекционных занятий и 13 практических. Курс только по возможностям самого языка. Про модули пока ничего не придумал. В целях курса не было обучение системных администраторов, но предъявить возможности и тонкости языка.

                Это сообщение было перенесено сюда или объединено из темы "Наша лаборатория"
                Сообщение отредактировано: Mastilior -

                Прикреплённый файлПрикреплённый файл______.zip (151.97 Кбайт, скачиваний: 1203)
                  SQLDB Class Library v.1.3.11

                  Объектно ориентированный подход к работе с базами данных.

                  Автор: Trustmaster
                  Язык: PHP4

                  Вам может показаться громоздким и нелогичным такой подход, но как показывает реальность, большинство серьезных проектов на PHP придерживаются именно объектно ориентированной методологии, в том числе и при работе с базами данных. Основная направленность таких классов - оградить разработчика от технических деталей. Полиморфизм позволяет использовать один и тот же код для разных баз данных. Данная библиотека предоставляет полиморфные классы для баз данных:
                  • FrontBase
                  • Informix
                  • Interbase
                  • MiniSQL
                  • Microsoft SQL Server
                  • MySQL
                  • PostgreSQL
                  • SQLite
                  • Sybase
                  В комплект поставки входит документация.

                  Это сообщение было перенесено сюда или объединено из темы "Наша лаборатория"
                  Сообщение отредактировано: Mastilior -

                  Прикреплённый файлПрикреплённый файлsqldb.zip (50.32 Кбайт, скачиваний: 1212)
                    FTP Class

                    Расширенный драйвер FTP для PHP


                    Автор: Trustmaster
                    Язык: PHP4


                    Этот класс предоставляет удобную объектно-ориентированную оболочку для стандартных FTP-функций PHP. Кроме того, он содержит методы, позволяющие производить более сложные операции (к примеру, закачка целой папки рекурсивно) и работать с файлами удаленно (чтение/запись). Некоторые методы позволяют вам не вникать в тонкости протокола FTP, другие наоборот, позволяют работать с FTP сервером напрямую.

                    В комплект поставки входит документация по классу.

                    Ждем с нетерпением стабильного PHP5, который несет с собой новые возможности работы с FTP.

                    Это сообщение было перенесено сюда или объединено из темы "Наша лаборатория"
                    Сообщение отредактировано: Mastilior -

                    Прикреплённый файлПрикреплённый файлftp.zip (26.33 Кбайт, скачиваний: 1196)
                      XTPL Template Engine

                      Компактный и удобный интерпретирующий шаблонный движок.


                      Автор: Trustmaster.
                      Язык: PHP4.


                      Никто не оспаривает непревзойденные возможности Smarty - лучшего шаблонного движка для PHP. Но во многих случаях использовать Smarty - как стрелять из пушки по воробьям. Выходит, что 99% скриптов составляет сам шаблонный движок.

                      В основе XTPL лежит немного иной принцип. Если Smarty компилирует шаблоны во временные PHP-скрипты, то XTPL - классический интепретатор. Кроме того, XTPL взаимодействует с PHP напрямую. Так, вы можете присвоить значение переменным частного сектора (видимым только из шаблонов) традиционным методом Assign(), а можете не делать этого, а работать напрямую с глобальной областью видимости вашего скрипта. При построении логических выражений и условий циклов используется синтаксис PHP. Вот некоторые ключевые аспекты XTPL:
                      • При работе с переменными XTPL смотрит сначала в список переменных, присвоенных методом Assign(), а затем (если не нашел нужную переменную) обращается к глобальной области видимости. В большинстве случаев это позволяет избавиться от десятков лишних вызовов Assign().
                      • Модификаторы переменных, как и в Smarty, но с расширенными возможностями. Фактически, любая PHP-функция может выступать в роли модификатора.
                      • Конструкция {modify}{/modify}, преобразующая HTML внутри нее.
                      • Ветвление {if}{else}{/if}.
                      • Циклы for и while, удобные, к примеру, при формировании таблиц.
                      • Полноценная поддержка вложенных (nested) конструкций, исключая только {modify}{/modify} и {php}{/php}.
                      • Конструкции {include} и {php}{/php}.
                      • Набор классов, реализующих XHTML/HTML4 тэги в виде PHP классов. В том числе класс SelectTag для преобразования массивов в выпадающие списки.
                      • Модульная поддержка функций- и классов-рассширений.
                      Что касается производительности, то XTPL почти не уступает Smarty в скорости выполнения программы, а при использовании на сервере Zend Optimizer выигрывает 5-40%. В качестве теста был использован шаблон, содержащий два десятка переменных для подставновки и пару логических ветвлений. Конфигурация: Athlon XP 2800+, Apache 2.0.49 + PHP 4.3.8 + Zend Optimizer. Сначала был первый запуск скриптов (компиляция шаблонов Smarty и оптимизация промежуточного кода Zend Optimizer'ом), после чего скрипты были перезапущены по 12 раз. Среднее время выполнения составило соответственно:
                      Цитата
                      Smarty            XTPL
                      ---------------------------
                      0.04824          0.02907


                      В комплект поставки входит документация по классам и обучение по конструкциям (Tutorial).

                      Это сообщение было перенесено сюда или объединено из темы "Наша лаборатория"
                      Сообщение отредактировано: Mastilior -

                      Прикреплённый файлПрикреплённый файлxtpl.zip (45.59 Кбайт, скачиваний: 1201)
                        Абстрактный класс "Object" для быстрого создания пакетов с поддержкой методов:
                        • new - создание объекта
                        • get - получение ссылки на атрибут
                        • set - установка атрибута
                        • check - установить атрибут, если атрибут не определён
                        • del - удаление атрибута
                        • def - проверка определённости атрибута
                        события:
                        • before, after - вызов пользовательских процедур
                        ExpandedWrap disabled
                          package Object;
                          use subs qw'before after';
                          use overload '""'=>'___str___',
                                       '~'=>'DESTROY';
                           
                          sub __new__ {
                              my($class, $self)=(shift, {@_});
                              bless $self, $class;
                              $self->after_new;
                              +$self
                          }
                           
                          sub __check__ {
                              my$self=shift;
                              my$val=pop;
                              my$var=$self->__get__(@_);
                              $$var=$val unless defined$$var;
                              +$var
                          }
                           
                          sub __def__ {+defined shift->Get(@_)}
                          sub __set__ {
                              my$self=shift;
                              my($val, $attr)=(pop, $self->__get__(@_));
                              $self->before_set;
                              $$attr=$val;
                              $self->after_set;
                              +$attr
                          }
                           
                          sub __get__ {
                              my$self=shift;
                              my($result, $self_ref, $ref)=(\$self, ref$self);
                           
                              $result=do{
                                  $ref=ref$$result;
                                  if($ref eq 'HASH' or $ref eq $self_ref)
                                  {
                                      +\$$result->{$_}
                                  }
                                  elsif($ref eq 'ARRAY')
                                  {
                                      +\$$result->[$_]
                                  }
                                  else
                                  {
                                      return undef
                                  }
                              } foreach @_;
                              +$result
                          }
                           
                          sub __del__ {
                              my$self=shift;
                              my$last=pop;
                              my($result, $self_ref, $ref, $ret)=(\$self, ref$self);
                           
                              $result=do{
                                  $ref=ref$$result;
                                  if($ref eq 'HASH' or $ref eq $self_ref)
                                  {
                                      +\$$result->{$_}
                                  }
                                  elsif($ref eq 'ARRAY')
                                  {
                                      +\$$result->[$_]
                                  }
                                  else
                                  {
                                      return undef
                                  }
                              } foreach @_;
                           
                              +do{
                                  $ref=ref$$result;
                                  if($ref eq 'HASH' or $ref eq $self_ref)
                                  {
                                      +delete$$result->{$last}
                                  }
                                  elsif($ref eq 'ARRAY')
                                  {
                                      $ret=$$result->[$last];
                                      @$$result=@$$result[0..$last-1, $last+1..$#$$result];
                                      +$ret
                                  }
                                  else
                                  {
                                      $ret=$$result;
                                      undef$$result;
                                      +$ret
                                  }
                              }
                          }
                           
                          sub ___str___ {
                              use Data::Dumper;
                              +Dumper shift
                          }
                           
                          sub __after__ {+@_}
                          sub __before__ {+@_}
                           
                          sub __CORE__::Object::AUTOLOAD {
                              my$self=shift;
                              my($package)=$AUTOLOAD=~/^(.+)::(.+)$/o or return undef;
                              index $2, '__' or die ':)Can\'t locate method '.$2.' in package '.__PACKAGE__;
                              my($function, @args)=split '_', $2;
                              my@result=$self->${\('__'.lcfirst($function).'__')}(@args, @_);
                              if($function=~/^[A-Z]/o)
                              {
                                  $result[0]=${$result[0]} while ref$result[0] eq 'SCALAR' || ref$result[0] eq 'REF';
                              }
                              +wantarray?@result:$result[0]
                          }
                           
                          sub DESTROY {undef $_[0]}
                           
                          +1;
                           
                          __END__
                           
                           
                          =head1 NAME
                           
                              Object - Provides abstract object class
                           
                          =head1 VERSION
                           
                              This document describes version 1.0 of Object.pm module,
                              released Jan 08, 2005.
                           
                          =head1 SYNOPSIS
                           
                              package My::Package;
                              use base 'Object';
                           
                              # methods "new", "set", "get" and their aliases
                              # are defined, place here your other methods,
                              # vars, constants, etc.
                           
                              package main;
                              $obj=new My::Package(
                                  size=>{
                                      b=>'c',
                                      d=>'e',
                                      c=>{
                                          't'=>'w'
                                      }
                                  },
                                  weight=>[
                                      12,
                                      {
                                          z=>'r'
                                      }
                                  ]
                              );
                           
                              $z=$obj->set_weight_1_z('f');       # returns \$obj->{weight}[1]{z}{f}
                              print $obj->Set_size_w({
                                                      't'=>'z',
                                                      'y'=>'x'
                                    })->{t};                      # prints 'z'
                           
                              $c=$obj->get_size('c');             # returns \$obj->{size}{c}
                              print $$c->{t};                     # prints 'w'
                           
                              $$c={11=>12};
                              print $obj->Get_size_c_11;          # prints '12'
                           
                              $c=$obj->Get_size_c->{t};           # returns $obj->{size}{c}{t}
                           
                              print int $obj->def_color;          # checks if key 'color' is defined
                           
                              $obj->check_color('red');           # sets value 'red' on key 'color'
                                                                  # if it's not defined
                           
                          =head1 DESCRIPTION
                           
                          =head1 METHODS
                           
                          =over 4
                           
                          =item ___str___
                                Returns a string, which was generated by L<Data::Dumper> from data stored in object
                           
                          =back
                           
                          =head1 AUTHOR
                           
                          Shatrov Alexey mail@yandex.ru
                           
                          Copyright (c) 2005 Shatrov Alexey. All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
                           
                          =cut
                        Сообщение отредактировано: fatalist -
                          Класс "Hash"

                          Переопределение хэш-массива для работы с нечёткими ключами.

                          Автор: Tishaishii.
                          Язык: Perl.

                          POD-описание внутри.
                          Сообщение отредактировано: Mastilior -

                          Прикреплённый файлПрикреплённый файлHash.rar (1.98 Кбайт, скачиваний: 1121)
                            Универсальный преобразователь текстовых документов RXParser 2.0

                            Модуль RXParser создан для преобразования текстовых документов с использованием
                            шаблонов.
                            Для использования этого модуля вам потребуется версия Perl 5.6.x.

                            Что нового?

                            Версия 2.0:

                            1. Классы пакета RXParser разложены по файлам с возможностью единообразной загрузки
                            из любого
                            класса пакета:
                            Filter
                            Rules
                            Template
                            Parser
                            Wizard

                            2. Добавлен класс RXParser::Wizard, работающий со всеми классами пакета (Rules,
                            Template,
                            Parser, Filter).
                            3. Упрощена работа с модулями. Основной модуль RXParser контролирует загрузку прочих
                            модулей.

                            Версия 1.7125:

                            1. Ускорена загрузка правил. Добавлена возможность сохранения отпарсенных правил
                            разбора и
                            сборки в отдельный файл с возможностью загрузки.
                            2. Исправлена ошибка несовместимости версии 1.6001. Теперь RXParser 1.7125 работает
                            для разных
                            платформ одинаково.
                            3. Дополнительно оптимизирован код модуля.

                            Версия 1.6001:

                            1. Введено пространство префиксов - в будущих версиях возможно появление
                            дополнительных
                            возможностей управления выводом, таких как итератор в текущей версии.
                            2. Дополнительно оптимизирован код модуля.

                            Версия 1.6:

                            1. Полностью переписан движок для записи шаблонов. Теперь процесс форматирования
                            выходных
                            документов происходит много быстрее и стал ещё менее требователен к ресурсам.
                            2. Включена поддержка кроссплатформенной блокировки файлов.
                            3. Дополнительно оптимизирован код модуля.

                            Это сообщение было перенесено сюда или объединено из темы "Обсуждение FAQ-ов"
                            Прикреплённый файлПрикреплённый файлRXParser.2.0.zip (155.29 Кбайт, скачиваний: 1180)
                              Утилита Str2Rex v0.98b - помогает преобразовывать пару строк в
                              регулярное выражение.

                              Мануал:
                              ExpandedWrap disabled
                                    Str2Rex v0.98b util - simply converts two strings to RegExp
                                 
                                    This util based on the classic LCS algorithm.
                                 
                                -------------------------------------------------------------------
                                 Usage:
                                      perl str2rex.pl -in=in.txt -out=out.txt
                                      perl str2rex.pl -in=in.txt -out=out.txt -locale=on
                                      perl str2rex.pl in=in.txt out=out.txt locale=off -join=(.+?)
                                 
                                 Arguments:
                                             -in - Input file path.
                                            -out - Output file path.
                                         -locale - Switches on/off using locale.
                                           -join - Use this argument to set variable part of
                                                   the resulting RegExp. Default value is (.*?)
                                 
                                 Example:
                                 
                                  Meaning, input file contains two strings and
                                                              have following Perl syntax:
                                 
                                 # file "in.txt"
                                 #-----------------------------------------------------------------
                                 # The beginning of input file
                                 + [<<'-- DELIMETER 1 --', <<'-- DELIMETER 2 --'];
                                 
                                 This!
                                    is the
                                     "first
                                  string!
                                 
                                -- DELIMETER 1 --
                                 
                                  This
                                    is>
                                      the "second string
                                 
                                -- DELIMETER 2 --
                                 
                                 # The end of input file
                                 #-----------------------------------------------------------------
                                 
                                 Then enter at your command line following commands:
                                 perl str2rex.pl -in=in.txt -out=out.txt
                                 
                                 As result you have something like:
                                 This(.*?)\ is(.*?)\ the\ \"(.*?)s(.*?)\ string
                                 
                                -------------------------------------------------------------------
                                                                 Shatrow Aleksey <cdch@yandex.ru>
                                                                            Krasnodar, 28.03.2005
                                -------------------------------------------------------------------


                              Это сообщение было перенесено сюда или объединено из темы "Обсуждение FAQ-ов"
                              Прикреплённый файлПрикреплённый файлstr2rex.zip (2.4 Кбайт, скачиваний: 1184)
                                Класс для упрощения работы с БД MySQL

                                Язык: PHP
                                Автор: aGR


                                В классе 3 функции:
                                1) Соединение с сервером и выбор БД
                                2) SQL запрос к БД с отслеживанием ошибок
                                3) Демонстрация содержимого результата запроса в виде HTML таблицы

                                Это сообщение было перенесено сюда или объединено из темы "Обсуждение FAQ-ов"
                                Сообщение отредактировано: aGR -

                                Прикреплённый файлПрикреплённый файлmysql.rar (0.63 Кбайт, скачиваний: 1263)
                                  RSTPL - Быстрая библиотека для работы с шаблонами

                                  Автор: Axis
                                  Язык: PHP4 и выше


                                  Данная библиотека работает с шаблонами со скоростью обработки строк заключенных в "". Шаблоны могут содержать только те данные, что может содержать текст заключенный в "", но, с другой стороны, используя средства PHP, нельзя создать что-то быстрее.
                                  Возможности:
                                  • Несколько шаблонов в одном файле
                                  • Поддержка глобальных и локальных подставляемых переменных
                                  • Работа с динамическими блоками
                                  • Высокая скорость

                                  Это сообщение было перенесено сюда или объединено из темы "Обсуждение FAQ-ов"
                                  Сообщение отредактировано: Mastilior -

                                  Прикреплённый файлПрикреплённый файлtemplate.rar (3.63 Кбайт, скачиваний: 931)
                                    чтение информации из mp3 файла.

                                    Автор: SCINER
                                    Язык: PHP


                                    Использование:
                                    ExpandedWrap disabled
                                      require_once("id.php");
                                      print_r(getTags("10_-_Ber_Upkennen_Ni_Bula.mp3"));

                                    Возвращаемое значение - массив:
                                    ExpandedWrap disabled
                                      Array
                                      (
                                          [FILE] => /home/u51935/market.bars-media.ru/www/mp3/Elephunk - Track 16.mp3
                                          [FILESIZE] => 2911975
                                          [VBR] => yes
                                          [FRAMES] => 6256
                                          [MPEG] => 1.0
                                          [LAYER] => 3
                                          [SAMPLERATE] => 44100
                                          [BPP] => 142
                                          [LENGTH] => 163
                                          [CHANELS] => Joint stereo
                                          [EMPHASIS] => None
                                          [ORIGINAL] => Yes
                                          [TITLE] => Track 16
                                          [ARTIST] => Black eyed peas
                                          [ALBUM] => Elephunk
                                          [YEAR] => 2004
                                          [GENRECODE] => 32
                                          [GENRE] => Classical
                                          [TRACK] => 16
                                          [COMMENT] => lenar2003@mail.ru
                                      )

                                    , если файл некорректный, то соответствующие поля не будут присутствовать в массиве!
                                    ExpandedWrap disabled
                                      <?
                                       
                                      //Written by SCINER: MP3-file parser
                                      //30-05-2007 - 14:41
                                       
                                      //Read mp3-header, id3v1.0, id3v1.1
                                       
                                      /*
                                      A   3   (0-2)   Tag индитификатор. Должны использоваться символы 'TAG' как char символы.
                                      +B  30  (3-32)  Title
                                      +C  30  (33-62) Artist
                                      +D  30  (63-92) Album
                                      +E  4   (93-96) Year
                                      +F  30  (97-126)    Comment
                                      +G  1   (127)   Genre
                                      */
                                       
                                      Function BinToDec($BinValue)
                                      {
                                          $I = 0;
                                          $BinToDec = 0;
                                          For ($I = 1; $I <= strlen($BinValue); $I++)
                                          {
                                              If (substr($BinValue, $I - 1, 1) == "1")
                                              {
                                                  $BinToDec = $BinToDec + pow(2 ,(strLen($BinValue) - $I));
                                              }
                                          }
                                          return $BinToDec;
                                      }
                                       
                                      function ByteToBit($ByteArray)
                                      {
                                          $Z =0;
                                          $I =0;
                                          $cnt =0;
                                          $ByteToBit = "";
                                          //convert 4*1 byte array to 4*8 bits'''''
                                          For ($Z = 1; $Z<=4; $Z++)
                                          {
                                              $subs = ord(substr($ByteArray, $Z-1, 1));
                                              For ($I = 7; $I >= 0; $I--)
                                              {
                                                  If(intval($subs / pow(2, $I)) == 1)
                                                  {
                                                      $ByteToBit = $ByteToBit."1";
                                                      $subs = $subs - pow(2 , $I);
                                                  }
                                                  ElseIf ($ByteToBit !== "")
                                                  {
                                                      $ByteToBit = $ByteToBit."0";
                                                  }
                                              }
                                          }
                                          return BinToDec($ByteToBit);
                                      }
                                       
                                      function isVBR($sign)
                                      {
                                          if($sign == "Xing")
                                          {
                                              return "yes";
                                          }
                                          else
                                          {
                                              return "no";
                                          }
                                      }
                                      function GetGenre($genre)
                                      {
                                      $_genres = array(
                                              0   => 'Blues',
                                              1   => 'Classic Rock',
                                              2   => 'Country',
                                              3   => 'Dance',
                                              4   => 'Disco',
                                              5   => 'Funk',
                                              6   => 'Grunge',
                                              7   => 'Hip-Hop',
                                              8   => 'Jazz',
                                              9   => 'Metal',
                                              10  => 'New Age',
                                              11  => 'Oldies',
                                              12  => 'Other',
                                              13  => 'Pop',
                                              14  => 'R&B',
                                              15  => 'Rap',
                                              16  => 'Reggae',
                                              17  => 'Rock',
                                              18  => 'Techno',
                                              19  => 'Industrial',
                                              20  => 'Alternative',
                                              21  => 'Ska',
                                              22  => 'Death Metal',
                                              23  => 'Pranks',
                                              24  => 'Soundtrack',
                                              25  => 'Euro-Techno',
                                              26  => 'Ambient',
                                              27  => 'Trip-Hop',
                                              28  => 'Vocal',
                                              29  => 'Jazz+Funk',
                                              30  => 'Fusion',
                                              31  => 'Trance',
                                              32  => 'Classical',
                                              33  => 'Instrumental',
                                              34  => 'Acid',
                                              35  => 'House',
                                              36  => 'Game',
                                              37  => 'Sound Clip',
                                              38  => 'Gospel',
                                              39  => 'Noise',
                                              40  => 'Alternative Rock',
                                              41  => 'Bass',
                                              42  => 'Soul',
                                              43  => 'Punk',
                                              44  => 'Space',
                                              45  => 'Meditative',
                                              46  => 'Instrumental Pop',
                                              47  => 'Instrumental Rock',
                                              48  => 'Ethnic',
                                              49  => 'Gothic',
                                              50  => 'Darkwave',
                                              51  => 'Techno-Industrial',
                                              52  => 'Electronic',
                                              53  => 'Pop-Folk',
                                              54  => 'Eurodance',
                                              55  => 'Dream',
                                              56  => 'Southern Rock',
                                              57  => 'Comedy',
                                              58  => 'Cult',
                                              59  => 'Gangsta',
                                              60  => 'Top 40',
                                              61  => 'Christian Rap',
                                              62  => 'Pop/Funk',
                                              63  => 'Jungle',
                                              64  => 'Native US',
                                              65  => 'Cabaret',
                                              66  => 'New Wave',
                                              67  => 'Psychadelic',
                                              68  => 'Rave',
                                              69  => 'Showtunes',
                                              70  => 'Trailer',
                                              71  => 'Lo-Fi',
                                              72  => 'Tribal',
                                              73  => 'Acid Punk',
                                              74  => 'Acid Jazz',
                                              75  => 'Polka',
                                              76  => 'Retro',
                                              77  => 'Musical',
                                              78  => 'Rock & Roll',
                                              79  => 'Hard Rock',
                                              80  => 'Folk',
                                              81  => 'Folk-Rock',
                                              82  => 'National Folk',
                                              83  => 'Swing',
                                              84  => 'Fast Fusion',
                                              85  => 'Bebob',
                                              86  => 'Latin',
                                              87  => 'Revival',
                                              88  => 'Celtic',
                                              89  => 'Bluegrass',
                                              90  => 'Avantgarde',
                                              91  => 'Gothic Rock',
                                              92  => 'Progressive Rock',
                                              93  => 'Psychedelic Rock',
                                              94  => 'Symphonic Rock',
                                              95  => 'Slow Rock',
                                              96  => 'Big Band',
                                              97  => 'Chorus',
                                              98  => 'Easy Listening',
                                              99  => 'Acoustic',
                                              100 => 'Humour',
                                              101 => 'Speech',
                                              102 => 'Chanson',
                                              103 => 'Opera',
                                              104 => 'Chamber Music',
                                              105 => 'Sonata',
                                              106 => 'Symphony',
                                              107 => 'Booty Bass',
                                              108 => 'Primus',
                                              109 => 'Porn Groove',
                                              110 => 'Satire',
                                              111 => 'Slow Jam',
                                              112 => 'Club',
                                              113 => 'Tango',
                                              114 => 'Samba',
                                              115 => 'Folklore',
                                              116 => 'Ballad',
                                              117 => 'Power Ballad',
                                              118 => 'Rhytmic Soul',
                                              119 => 'Freestyle',
                                              120 => 'Duet',
                                              121 => 'Punk Rock',
                                              122 => 'Drum Solo',
                                              123 => 'Acapella',
                                              124 => 'Euro-House',
                                              125 => 'Dance Hall',
                                              126 => 'Goa',
                                              127 => 'Drum & Bass',
                                              128 => 'Club-House',
                                              129 => 'Hardcore',
                                              130 => 'Terror',
                                              131 => 'Indie',
                                              132 => 'BritPop',
                                              133 => 'Negerpunk',
                                              134 => 'Polsk Punk',
                                              135 => 'Beat',
                                              136 => 'Christian Gangsta Rap',
                                              137 => 'Heavy Metal',
                                              138 => 'Black Metal',
                                              139 => 'Crossover',
                                              140 => 'Contemporary Christian',
                                              141 => 'Christian Rock',
                                              142 => 'Merengue',
                                              143 => 'Salsa',
                                              144 => 'Trash Metal',
                                              145 => 'Anime',
                                              146 => 'Jpop',
                                              147 => 'Synthpop');
                                       
                                          if(($genre<148) && ($genre>-1))
                                          {
                                              return $_genres[$genre];
                                          }
                                          else
                                          {
                                              return '';
                                          }
                                      }
                                       
                                      function GetLayer($byte)
                                      {   $ret = 0;
                                          $layers = Array(0, 3, 2, 1);
                                          if ((ord($byte) & 2) == 2) $ret += 1;
                                          if ((ord($byte) & 4) == 4) $ret += 2;
                                          return $layers[$ret];
                                      }
                                       
                                      function isOriginal($byte)
                                      {   $ret = 0;
                                          $originals = Array('No' ,'Yes');
                                          if ((ord($byte) & 4) == 4) $ret += 1;
                                          return $originals[$ret];
                                      }
                                       
                                      function getEmphasis($byte)
                                      {   $ret = 0;
                                          $emphasis = Array('None', '50/15 microseconds', 'Dunno', 'CITT j.17');
                                          if ((ord($byte) & 1) == 1) $ret += 1;
                                          if ((ord($byte) & 2) == 2) $ret += 2;
                                          return $emphasis[$ret];
                                      }
                                       
                                      function getChanels($byte)
                                      {   $ret = 0;
                                          $chanels = Array('Stereo', 'Joint stereo', 'Dual channel', 'Mono');
                                          if ((ord($byte) & 64) == 64) $ret += 1;
                                          if ((ord($byte) & 128) == 128) $ret += 2;
                                          return $chanels[$ret];
                                      }
                                       
                                      function GetMPEG($byte)
                                      {   $ret = 0;
                                          $mpegs = Array('2.5','?','2.0','1.0');
                                          if ((ord($byte) & 8) == 8) $ret |= 1;
                                          if ((ord($byte) & 16) == 16) $ret |= 2;
                                          return $mpegs[$ret];
                                      }
                                       
                                      function GetSampleRate($byte, $mpeg)
                                      {   $ret = 0;
                                          $samplerate1 = Array(44100,48000,32000,'?');
                                          $samplerate2 = Array(22050,24000,16000, '?');
                                          if ((ord($byte) & 4) == 4) $ret += 1;
                                          if ((ord($byte) & 8) == 8) $ret += 2;
                                          if($mpeg=='1.0')
                                          {
                                              return $samplerate1[$ret];
                                          }
                                          elseif($mpeg=='2.0')
                                          {
                                              return $samplerate2[$ret];
                                          }else{return '?';}
                                      }
                                       
                                       
                                      function GetBitRate($byte, $mpeg, $layer)
                                      {
                                        $ret = 0;
                                        if ((ord($byte) & 16) == 16) {$ret |= 1;}
                                        if ((ord($byte) & 32) == 32) {$ret |= 2;}
                                        if ((ord($byte) & 64) == 64) {$ret |= 4;}
                                        if ((ord($byte) & 128) == 128) {$ret |= 8;}
                                        $bitrates = Array(
                                                          '1.0'=>Array(
                                                                      '1'=>Array(0,32,64,96,128,160,192,224,256,288,320,352,384,416,448,'?'),
                                                                      '2'=>Array(0,32,48,56,64,80,96,112,128,160,192,224,256,320,384,'?'),
                                                                      '3'=>Array(0,32,40,48,56,64,80,96,112,128,160,192,224,256,320,'?')
                                                                      ),
                                                          '2.0'=>Array(
                                                                      '1'=>Array(0,32,48,56,64,80,96,112,128,144,160,176,192,224,256,'?'),
                                                                      '2'=>Array(0,8,16,24,32,40,48,56,64,80,96,112,128,144,160,'?'),
                                                                      '3'=>Array(0,8,16,24,32,40,48,56,64,80,96,112,128,144,160,'?')
                                                                      )
                                                        );
                                        return $bitrates[$mpeg][$layer][$ret];
                                      }
                                       
                                      function getTags($mp3file)
                                      {
                                       
                                          $bpp = 0;
                                          $tags = Array();
                                          $tags['FILE'] = (realpath($mp3file));
                                       
                                          if(file_exists($mp3file))
                                          {
                                              if(is_readable($mp3file))
                                              {
                                       
                                                  $f = fopen($mp3file,'r');
                                                  fseek($f,filesize($mp3file)-128);
                                                  $ret = fread($f,128);
                                       
                                                  $start = -1;
                                                  //search mp3-header
                                                  for ($i = 0; $i <= filesize($mp3file); $i++)
                                                  {
                                                    fseek($f, $i);
                                                    $byte = fread($f, 1);
                                                    if(ord($byte)==255)
                                                    {
                                                      fseek($f, $i+1);
                                                      $bits = 0;
                                                      $byte = fread($f, 1);
                                                        if ((ord($byte) & 32) == 32) {$bits |= 2;}
                                                        if ((ord($byte) & 64) == 64) {$bits |= 4;}
                                                        if ((ord($byte) & 128) == 128) {$bits |= 8;}
                                                      if ($bits==14)
                                                      {
                                                          $start = $i;
                                                          break;
                                                      }
                                                    }
                                                  }
                                       
                                                  $tags['FILESIZE'] = filesize($mp3file);
                                       
                                                  if($start>=0)
                                                  {
                                                      fseek($f, $start + 0); $byte0 = fread($f, 1);
                                                      fseek($f, $start + 1); $byte1 = fread($f, 1);
                                                      fseek($f, $start + 2); $byte2 = fread($f, 1);
                                                      fseek($f, $start + 3); $byte3 = fread($f, 1);
                                                      fseek($f, $start + 36); $xing = fread($f, 4);
                                       
                                                      $tags['VBR'] = isVBR($xing);
                                                      $tags['FRAMES'] = 1;
                                       
                                                      if($tags['VBR']=="yes")
                                                      {
                                                          //calculate # of frames
                                                          $Frames = 0;
                                                          fseek($f, $start + 44);
                                                          $frame = fread($f, 4); //get framelength
                                                          $Frames = ByteToBit($frame);
                                                          $tags['FRAMES'] = $Frames;
                                                      }
                                       
                                                      fclose($f);
                                       
                                                      $tags['MPEG'] = GetMPEG($byte1);
                                                      $tags['LAYER'] = GetLayer($byte1);
                                                      $tags['SAMPLERATE'] = GetSampleRate($byte2, $tags['MPEG']);
                                       
                                       
                                                      if($tags['VBR']=="yes")
                                                      {
                                                          $Temp = Array(0, 12, 144, 144);
                                                          $tags['BPP'] = (filesize($mp3file) * $tags['SAMPLERATE']) / (intval($tags['FRAMES'])) / 1000 / $Temp[round($tags['LAYER'])];
                                                      }
                                                      else
                                                      {
                                                          $tags['BPP'] = GetBitRate($byte2, $tags['MPEG'], $tags['LAYER']);
                                                      }
                                       
                                                      $tags['LENGTH'] = intval(($tags['FILESIZE'] * 8) / $tags['BPP'] / 1000);
                                                      //$Duration = intval($Duration / 60) . "m " . ($Duration - intval($Duration / 60) * 60) . "s";
                                       
                                                      // floor( ((8 * filesize($mp3file))/1000) / $tags['BPP']);
                                                      $tags['CHANELS'] = getChanels($byte3);
                                                      $tags['EMPHASIS'] = getEmphasis($byte3);
                                                      $tags['ORIGINAL'] = isOriginal($byte3);
                                                      $tags['BPP'] = intval($tags['BPP']);
                                       
                                                  }
                                                  else
                                                  {
                                                      return false;
                                                  }
                                       
                                                  //$tags[] = $ret;
                                                  if(substr($ret,0,3)=="TAG")
                                                  {
                                                    $tags['TITLE'] = (chop(substr($ret,3,32-3+1)));
                                                    $tags['ARTIST'] = (chop(substr($ret,33,62-33+1)));
                                                    $tags['ALBUM'] = (chop(substr($ret,63,92-63+1)));
                                                    $tags['YEAR'] = (chop(substr($ret,93,96-93+1)));
                                                    $tags['GENRECODE'] = (ord(substr($ret,127,1)));
                                                    $tags['GENRE'] = (GetGenre(ord(substr($ret,127,1))));
                                                    if((ord(substr($ret,125,1))==0) && (ord(substr($ret,126,1))!==0))
                                                    {
                                                      $tags['TRACK'] = (ord(substr($ret,126,1)));
                                                      $tags['COMMENT'] = (chop(substr($ret,97,28)));
                                                    }
                                                    else
                                                    {
                                                      $tags['COMMENT'] = (chop(substr($ret,97,30)));
                                                    }
                                       
                                       
                                       
                                       
                                                  }
                                       
                                              }
                                          }
                                          return $tags;
                                      }
                                       
                                      ?>


                                    Обсуждение и доработки здесь: mp3, tags, id3v1
                                    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                    0 пользователей:
                                    Закрыто Рысь 29-05-2007:


                                    Рейтинг@Mail.ru
                                    [ Script execution time: 0,0731 ]   [ 16 queries used ]   [ Generated: 28.03.24, 23:19 GMT ]