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

Статус
В этой теме нельзя размещать новые ответы.

admLoki

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

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

Вроде проверяет нормально, но на большом обьеме текста проверить не смог.
 
Зачем тут вообще городить регулярки? Почему бы не пользовать для проверки строки пробную десериализацию и проверять результат, возвращаемый функцией unserialize?
Например, так:
PHP:
if (unserialize($serialized_data)===FALSE)
  echo 'на входе - несериализованная или поврежденная строка!';
 
Зачем тут вообще городить регулярки? Почему бы не пользовать для проверки строки пробную десериализацию и проверять результат, возвращаемый функцией unserialize?
Например, так:
PHP:
if (unserialize($serialized_data)===FALSE)
  echo 'на входе - несериализованная или поврежденная строка!';
Объясняю. Допустим, строка у меня(серилизованная) - 15 тысяч символов. Как думаешь, что быстрее отработает - быстрые preg_* функции, или тормозящие сериализации?
 
Не сомневаюсь, что десериализация выполняется быстрее любых функций для работы с рег.выражениями, ибо в PHP нет ничего медленнее функций preg_*. Причём не просто быстрее, а на порядок быстрее, то есть раз в 10. Не веришь - напиши тест с замером времени!
 
в PHP нет ничего медленнее функций preg_*
На отличненько. Жжешь, горелка. Иди-ка почитай документацию.
Далее. Зачем мне выполнять лишнюю рутину, а именно десериализацию large-класса, например, если я кладу его в базу, и мне просто надо проверить, правильные ли данные в в нее идут, т.е. конкретно сериализованная строка?

Заодно по ссылочкам сходи, почитай умных людей :
Для просмотра ссылки Войди или Зарегистрируйся
Для просмотра ссылки Войди или Зарегистрируйся
 
ИМХО, спор не о чём.
Что касается ссылок, не понятно:
- в первой ссылке сравнивается preg_* с ereg* (которые вообще из языка удаляются)
- во второй сравнение serialize с json - имеющее как-то не особо сильное отношение к вашему спору.
 
ИМХО, спор не о чём.
Что касается ссылок, не понятно:
- в первой ссылке сравнивается preg_* с ereg* (которые вообще из языка удаляются)
- во второй сравнение serialize с json - имеющее как-то не особо сильное отношение к вашему спору.
По первой ссылке я отправил его в связи с абсурдным утверждением по поводу preg.
По второй ссылке - чтобы он посмотрел скорость работы при сериализации.
 
Проверил банально.
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
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху