我需要解析一个非常复杂的字符串来提取它的特定部分,其中包含数据库的外键(该片段来自名为Interspire Email Marketer的产品,并包含一些奇怪的逻辑来过滤联系人列表)。
有问题的字符串如下(是的,我意识到它非常奇怪。这就是系统存储它的方式):
a:2:{s:5:"Lists";a:1:{i:0;s:1:"6";}s:5:"Rules";a:1:{i:0;a:3:
{s:4:"type";s:5:"group";s:9:"connector";s:3:"and";s:5:"rules";a:1:{i:0;a:3:
{s:4:"type";s:4:"rule";s:9:"connector";s:3:"and";s:5:"rules";a:2:
{s:8:"ruleName";s:3:"100";s:12:"ruleOperator";s:7:"isempty";}}}}}}
我需要的部分是{i:0;s:1:"<here>";}
,但它不仅仅是一个字符。如何解析这个奇怪的字符串并用Ruby提取我需要的数字?
答案 0 :(得分:4)
您可以使用正则表达式:
s = 'a:2:{s:5:"Lists";a:1:{i:0;s:1:"6";}s:5:"Rules";a:1:{i:0;a:3:
{s:4:"type";s:5:"group";s:9:"connector";s:3:"and";s:5:"rules";a:1:{i:0;a:3:
{s:4:"type";s:4:"rule";s:9:"connector";s:3:"and";s:5:"rules";a:2:
{s:8:"ruleName";s:3:"100";s:12:"ruleOperator";s:7:"isempty";}}}}}}'
print $1 if s =~ /\{i:0;s:1:\"(\d+)\";\}/ // prints 6
答案 1 :(得分:3)
这个字符串是由PHP生成的 - 所以如果你有权访问PHP,最好用它来解析它,因为它是原生的:
$str='a:2:{s:5:"Lists";a:1:{i:0;s:1:"6";}s:5:"Rules";a:1:{i:0;a:3:{s:4:"type";s:5:"group";s:9:"connector";s:3:"and";s:5:"rules";a:1:{i:0;a:3:{s:4:"type";s:4:"rule";s:9:"connector";s:3:"and";s:5:"rules";a:2:{s:8:"ruleName";s:3:"100";s:12:"ruleOperator";s:7:"isempty";}}}}}}';
$array = unserialize($str);
return $array['Lists'][0];
返回6,即<here>
部分。
数组看起来像:
array (
'Lists' =>
array (
0 => '6',
),
'Rules' =>
array (
0 =>
array (
'type' => 'group',
'connector' => 'and',
'rules' =>
array (
0 =>
array (
'type' => 'rule',
'connector' => 'and',
'rules' =>
array (
'ruleName' => '100',
'ruleOperator' => 'isempty',
),
),
),
),
),
)
您可以使用'system'命令从ruby调用PHP,或者甚至将其作为Web服务进行解析 - 所有这些都取决于您的情况。