【问题标题】:Use preg_match to extract part of Serialized Data in PHP在 PHP 中使用 preg_match 提取部分序列化数据
【发布时间】:2016-10-21 10:36:11
【问题描述】:

我希望从存储在 MySql DB 中的序列化数组中提取一些数据。我继承了这一点,一些记录被打破,但我仍然可以提取一些信息。当我反序列化时,它确实会返回一个错误,所以很遗憾,这是不可能的。

这是一些序列化的数据:-

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

我希望使用 preg_match 从中提取值,但我需要一些帮助来尝试在 PHP 中提取它。

你能帮忙吗?

【问题讨论】:

  • 有什么正当理由不能直接反序列化它吗?如果您需要查询部分序列化数据,那么您的数据库设计可能很糟糕。
  • 嗨 ShiraNai7,我已经继承了上面已经表达的这个数据库,并且一些数据被破坏了。这就是为什么我想这样做。有 400,000 条记录,所以我不会很快尝试修复其中任何一条。
  • 定义“破碎”。您还可以发布整个序列化字符串,而不仅仅是其中的一部分。
  • 恐怕我不能这样做,因为它是敏感信息。由于新行未正确提交而导致偏移问题,因此已损坏。
  • 每次将序列化数据放入数据库时​​,Codd 都会杀死一只小猫。您是要提取所有值,还是只提取邮政编码?

标签: php mysql serialization preg-match


【解决方案1】:

你可以试试这个:

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

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

但最后一个仅在您要查找的给定数据部分始终具有 s:16 或 s:8(数据项的长度)时才有效。否则不正确

【讨论】:

  • 如何处理字符串中的转义引号? s:12:"Some \"text\""
  • 长度确实会发生变化,因为我们的邮政编码可以少至 5 个字符,多至 8 个字符。是否可以在其中添加一些东西来应对这种情况?
  • 基本上我只想从上面的代码中返回 TT12 3TT。
  • 这个邮政编码有哪些变化?我的意思是它的价值观。有没有一些共同的模式?
  • 都是大写字母+数字吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多