#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. Они всегда заглавные буквы цифры?