2009-09-22 2 views
0

데이터베이스의 외래 키를 포함하는 특정 섹션을 추출하기 위해 매우 복잡한 문자 문자열을 구문 분석해야합니다 (스 니펫은 Interspire Email Marketer라는 제품에서 가져온 것으로, 연락처 목록을 필터링하는 이상한 논리).Ruby에서 복잡한 문자 문자열 구문 분석

다음과 같이 문제의 문자열입니다 (예, 나는 그것이 매우 이상한 실현 그건 어떻게 시스템 저장합니다.) :

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

파서는 어떻게 그 부분을 추출한다는 것을 알고 있습니까? 그것은 i와 s에 대한 가치가 있기 때문에? i는 0이고 s는 1이기 때문에? 즉, {i : \ *; s : \ * : "\ *"}를 찾으십니까 \ *는 무엇이든 될 수 있습니다. 아니면 내가 찾고 있어요 : 0; s : 1? 또는 다른 것? – DigitalRoss

+1

더 많은 샘플을 검사하고 모두에 대해 true 인 ""문자열을 찾는 방법을 찾아야합니다. – Inshallah

답변

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

<here> 부분 인 6을 반환합니다. 모든 사건에 따라 달라집니다 - 당신이 '시스템'명령을 사용하여 루비에서 PHP를 호출하거나 구문 분석을 할 수있는 웹 서비스로 넣을 수 있습니다

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

: 같은

배열 보인다.

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