2016-11-02 25 views
1

我有一大串數據無效的大型數據庫。是否有一個驗證PHP序列化數據的正則表達式?

數據由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查詢返回具有損壞的序列化數據的行。

+0

只是好奇這將如何發生,除非數據庫字段被更新爲刪除字符? – AbraCadaver

+0

我不知道它是如何發生的......在幾乎所有情況下,數據都與至少2年內沒有使用該系統的用戶有關。除此之外我什麼都不知道。 –

回答

2

這也許可以清理了一下,但工作原理:

$result = preg_replace_callback('/s:\d+:"([^"]+)"/', 
           function($m) { 
            return 's:'.strlen($m[1]).':"'.$m[1].'"'; 
           }, $string); 
  • 匹配字符串組成
  • 與匹配的字符串

strlen()更換長度組件在MySQL端你可以試試mysql-udf-regexp

+0

這很酷,但我正在尋找一些不使用PHP的東西。我想把它交給我的Unix管理員,他們使用一堆可以使用正則表達式的Unix工具。無論出於何種原因,他們都不喜歡使用PHP。 –

+0

祝你好運!有可能是可行的。 – AbraCadaver