2009-09-22 5 views
0

Je dois analyser une chaîne de caractères extrêmement complexe pour en extraire une section particulière, qui contient une clé étrangère à une base de données (l'extrait provient d'un produit appelé Interspire Email Marketer et contient une logique étrange pour filtrer une liste de contacts).Analyse d'une chaîne complexe de caractères avec Ruby

La chaîne en question est la suivante (oui, je me rends compte qu'il est extrêmement bizarre Voilà comment le système stocke elle.):

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";}}}}}} 

La partie que je besoin est {i:0;s:1:"<here>";} mais il peut être plus qu'un seul personnage. Comment puis-je analyser cette chaîne étrange et extraire le nombre dont j'ai besoin avec Ruby?

+2

Comment l'analyseur sait-il extraire cette partie? Parce qu'il a une certaine valeur pour i et s? Parce que i est 0 et s est 1? C'est-à-dire, cherchez-vous {i: \ *; s: \ *: "\ *"} où \ * peut être quelque chose? Ou cherchez-vous i: 0; s: 1? Ou autre chose? – DigitalRoss

+1

Vous devriez examiner plus d'exemples et chercher des moyens de trouver la chaîne "" qui vaut vrai pour chacun d'eux. – Inshallah

Répondre

3

Cette chaîne est générée par PHP - donc si vous avez accès à PHP, il est préférable de l'utiliser pour l'analyser, car il est là natif:

$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]; 

renvoie 6, qui correspond à la partie <here>.

Le tableau ressemble à:

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', 
     ), 
     ), 
    ), 
    ), 
), 
) 

vous pouvez appeler PHP depuis ruby ​​en utilisant la commande « système », ou même le mettre comme un service Web pour faire l'analyse syntaxique - tout dépend de votre cas.

4

Vous pouvez utiliser des expressions régulières:

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 
Questions connexes