Пример: узнаем сериализованную строку.

Тема в разделе "Регулярные выражения", создана пользователем admLoki, 11 дек 2008.

Статус темы:
Закрыта.
Модераторы: xpert13
  1. admLoki

    admLoki генератор случайного PHP

    Регистр.:
    14 сен 2006
    Сообщения:
    481
    Симпатии:
    93
    Иногда требуется проверить, сериализована строка, или нет. Например, перед добавлением массива с данными в БД.

    Посему накалякал вот такую регулярку :
    Код:
    /(a|O|s|b)\x3a[0-9]*?((\x3a((\x7b?(.+)\x7d)|(\x22(.+)\x22\x3b)))|(\x3b))/
    
    Вроде проверяет нормально, но на большом обьеме текста проверить не смог.
     
  2. Avtandil

    Avtandil Создатель

    Регистр.:
    30 сен 2006
    Сообщения:
    30
    Симпатии:
    24
    Зачем тут вообще городить регулярки? Почему бы не пользовать для проверки строки пробную десериализацию и проверять результат, возвращаемый функцией unserialize?
    Например, так:
    PHP:
    if (unserialize($serialized_data)===FALSE)
      echo 
    'на входе - несериализованная или поврежденная строка!';
     
  3. admLoki

    admLoki генератор случайного PHP

    Регистр.:
    14 сен 2006
    Сообщения:
    481
    Симпатии:
    93
    Объясняю. Допустим, строка у меня(серилизованная) - 15 тысяч символов. Как думаешь, что быстрее отработает - быстрые preg_* функции, или тормозящие сериализации?
     
  4. Avtandil

    Avtandil Создатель

    Регистр.:
    30 сен 2006
    Сообщения:
    30
    Симпатии:
    24
    Не сомневаюсь, что десериализация выполняется быстрее любых функций для работы с рег.выражениями, ибо в PHP нет ничего медленнее функций preg_*. Причём не просто быстрее, а на порядок быстрее, то есть раз в 10. Не веришь - напиши тест с замером времени!
     
  5. admLoki

    admLoki генератор случайного PHP

    Регистр.:
    14 сен 2006
    Сообщения:
    481
    Симпатии:
    93
    На отличненько. Жжешь, горелка. Иди-ка почитай документацию.
    Далее. Зачем мне выполнять лишнюю рутину, а именно десериализацию large-класса, например, если я кладу его в базу, и мне просто надо проверить, правильные ли данные в в нее идут, т.е. конкретно сериализованная строка?

    Заодно по ссылочкам сходи, почитай умных людей :
    http://www.mail-archive.com/php-general@lists.php.net/msg19776.html
    http://habrahabr.ru/blogs/php/30210/
     
  6. PHP_Master

    PHP_Master

    Регистр.:
    3 фев 2008
    Сообщения:
    2.647
    Симпатии:
    590
    ИМХО, спор не о чём.
    Что касается ссылок, не понятно:
    - в первой ссылке сравнивается preg_* с ereg* (которые вообще из языка удаляются)
    - во второй сравнение serialize с json - имеющее как-то не особо сильное отношение к вашему спору.
     
  7. admLoki

    admLoki генератор случайного PHP

    Регистр.:
    14 сен 2006
    Сообщения:
    481
    Симпатии:
    93
    По первой ссылке я отправил его в связи с абсурдным утверждением по поводу preg.
    По второй ссылке - чтобы он посмотрел скорость работы при сериализации.
     
  8. admLoki

    admLoki генератор случайного PHP

    Регистр.:
    14 сен 2006
    Сообщения:
    481
    Симпатии:
    93
    Проверил банально.
    PHP:
    $array = array();
    $iterations 10000;
    while(
    $iterations)
    {
        
    $array[] = array(rand());
        
    $iterations--;
    }

    $serialized serialize($array);
    list(
    $min$max) = explode(" ",microtime());
    $start $min $max;
    $unserialized unserialize($serialized);
    list(
    $min$max) = explode(" ",microtime());
    $end =  substr((($min $max) -  $start),0,6);

    echo 
    "Unserialized with $end sec.";
    list(
    $min$max) = explode(" ",microtime());
    $start $min $max;
    $preg preg_match("/(a|O|s|b)\:[0-9]*?((\:((\{?(.+)\})|(\"(.+)\"\;)))|(\;))/"$serialized);
    list(
    $min$max) = explode(" ",microtime());
    $end =  substr((($min $max) -  $start),0,6);
    echo 
    "<br />Pregged with $end sec and " . ($preg 'matched' 'unmatched');
    Результат:
    Unserialized with 0.0145 sec.
    Pregged with 0.0013 sec and matched
     
  9. admLoki

    admLoki генератор случайного PHP

    Регистр.:
    14 сен 2006
    Сообщения:
    481
    Симпатии:
    93

    А почему ви сп'гашиваете?
    Не пали.
     
  10. admLoki

    admLoki генератор случайного PHP

    Регистр.:
    14 сен 2006
    Сообщения:
    481
    Симпатии:
    93
    Лучше почисть там где мое имя. Клабберы и так знают меня, но лишний раз светиться мне не надо.
     
Статус темы:
Закрыта.