Разбор сложной строки символов с помощью Ruby - PullRequest
0 голосов
/ 23 сентября 2009

Мне нужно проанализировать чрезвычайно сложную строку символов, чтобы извлечь ее конкретный раздел, который содержит внешний ключ к базе данных (фрагмент взят из продукта 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?

Ответы [ 2 ]

4 голосов
/ 23 сентября 2009

Вы можете использовать регулярные выражения:

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
3 голосов
/ 12 января 2010

Эта строка генерируется 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',
          ),
        ),
      ),
    ),
  ),
)

Вы можете вызывать PHP из ruby ​​с помощью команды 'system' или даже использовать его как веб-сервис для анализа - все зависит от вашего случая.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...