【问题标题】:Is there a regular expression that validates data serialized by PHP?是否有一个正则表达式可以验证 PHP 序列化的数据?
【发布时间】:2016-11-02 17:56:25
【问题描述】:

我有一个大型数据库,其中包含一堆无效的序列化数据。

数据由 PHP 序列化,并且在每种情况下反序列化都失败,其中一个值的字符串长度关闭。

a:2:{s:7:"example";s:14:"This one works";s:11:"example_two";s:50:"This one is broken";}

我想将所有序列化数据导出到 CSV,找到所有损坏的字段并修复或删除它们。

我认为这可以通过正则表达式来完成...对于每一行,找到每个 s:[length],检查下一个冒号后引用的值是否与数字 [length] 的长度相等。如果长度不匹配,则返回整行。

任何帮助将不胜感激。如果您可以提供一个返回带有损坏的序列化数据的行的 mysql 查询,那将是超级奖励。

【问题讨论】:

  • 只是好奇除非更新数据库字段以删除字符,否则会发生这种情况?
  • 我不知道它是怎么发生的......在几乎所有情况下,数据都与至少 2 年未使用该系统的用户有关。除此之外我什么都不知道。

标签: php mysql regex serialization


【解决方案1】:

这可能会稍微清理一下,但可以:

$result = preg_replace_callback('/s:\d+:"([^"]+)"/',
                                function($m) {
                                    return 's:'.strlen($m[1]).':"'.$m[1].'"';
                                }, $string);
  • 匹配字符串组件
  • 将长度分量替换为匹配字符串的strlen()

在 MySQL 方面,您可以尝试mysql-udf-regexp

【讨论】:

  • 这很酷,但我正在寻找不使用 php 的东西。我想把它交给我的 Unix 管理员,他们使用一堆可以使用正则表达式的 Unix 工具。无论出于何种原因,他们都不喜欢使用 PHP。
  • 祝你好运!很有可能它是可行的。
猜你喜欢
  • 2012-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-21
  • 1970-01-01
  • 2010-09-17
  • 2015-02-06
相关资源
最近更新 更多