Используйте preg_match для извлечения части сериализованных данных в PHP

#php #mysql #serialization #preg-match

#php #mysql #сериализация #preg-match

Вопрос:

Я хочу извлечь некоторые данные из сериализованного массива, хранящегося в базе данных MySQL. Я унаследовал это, и некоторые записи повреждены, но я все еще могу извлечь некоторую информацию. Когда я отменяю сериализацию, она возвращается с ошибкой, так что, к сожалению, об этом не может быть и речи.

Это некоторые из сериализованных данных: —

 s:16:"current_postcode";s:8:"TT12 3TT";
  

Я хочу извлечь только значение из этого, используя preg_match, но мне нужна помощь, пытаясь извлечь это в PHP.

Вы можете помочь?

Комментарии:

1. Есть какая-либо уважительная причина, по которой вы не можете просто отменить сериализацию? Если вам нужно запросить часть сериализованных данных, то дизайн вашей базы данных, скорее всего, плохой.

2. Привет, ShiraNai7, я унаследовал эту базу данных, как уже было сказано выше, и некоторые данные повреждены. Вот почему я хочу сделать это таким образом. Существует 400 000 записей, поэтому я не буду пытаться исправить что-либо из этого в ближайшее время.

3. Определите «сломанный». Вы также можете опубликовать всю сериализованную строку, а не только ее часть.

4. Боюсь, я не могу этого сделать, поскольку это конфиденциальная информация. Это не работает, поскольку возникают проблемы со смещением, вызванные неправильной отправкой новых строк.

5. Каждый раз, когда вы помещаете сериализованные данные в базу данных, Codd убивает котенка. Вы пытаетесь извлечь все значения или только почтовые индексы?

Ответ №1:

Вы можете попробовать с этим:

 preg_match_all('/"([^"] )"/', $data, $matches);
  

или

 preg_match_all('/(?:s:16:|s:8:)"([^"] )"/', $data, $matches);
  

но последнее значение допустимо только в том случае, если у вас всегда есть s: 16 или s: 8 (длина элемента данных) для заданной части данных, которые вы ищете. В противном случае это будет неправильно

Комментарии:

1. Как это обрабатывает экранированные кавычки в строках? s:12:"Some "text""

2. Длина меняется, поскольку наши почтовые индексы могут содержать всего 5 символов и достигать 8. Можно ли что-то добавить в это, чтобы покрыть эту вероятность?

3. По сути, я просто хочу вернуть TT12 3TT из приведенного выше кода.

4. Каковы варианты этого почтового кода? Я имею в виду его значения. Есть ли какой-то общий шаблон?

5. Они всегда заглавные буквы цифры?