PHP如何使用多个正则表达式来爆炸字符串?

时间:2012-10-23 12:11:39

标签: php regex parsing

我有一个长字符串,由一系列由单个字符~分隔的段组成。

示例:

ST*Any*Characters*are*allowed*here~optional*segment*~optional*segment*~IT1*Any*Characters*are*allowed*here~optional*segment*~IT1*Any*Characters*are*allowed*here~IT1*Any*Characters*are*allowed*here~optional*segment*~optional*segment*~TDS*Any*Characters*are*allowed*here~optional*segment*~optional*segment*~

请注意,这是一个单独的字符串,根本没有新行。我只是将其格式化以便于阅读。

输出应为:

Array{
      [0]=>ST*Any*Characters*are*allowed*here~optional*segment*~optional*segment*

      [1]=>Array{
                 [0]=>IT1*Any*Characters*are*allowed*here~optional*segment*  
                 [1]=>IT1*Any*Characters*are*allowed*here 
                 [2]=>IT1*Any*Characters*are*allowed*here~optional*segment*~optional*segment*  
                }

      [2]=>TDS*Any*Characters*are*allowed*here~optional*segment*~optional*segment*
}

如何从输入字符串生成此输出?

问题是,我只能保证这些细分受众群的开头(STIT1TDS),因为它们是强制性的,但它们可能后跟随机数的可选段。

当然,分隔符~可能只发生在段之间而不是在它们内部。

更新:我需要将字符串分解为3个部分:

  1. 字符串从ST开始,直到第一次出现IT1
  2. IT1开头并以下一个IT1开头的字符串集合。
  3. TDS开始直到字符串结尾的最后一个字符串。

1 个答案:

答案 0 :(得分:1)

根据您更新的问题,我会使用preg_split:

$var = '~' . "ST*Any*Characters*are*allowed*here~optional*segment*~optional*segment*~IT1*Any*Characters*are*allowed*here~optional*segment*~IT1*Any*Characters*are*allowed*here~IT1*Any*Characters*are*allowed*here~optional*segment*~optional*segment*~TDS*Any*Characters*are*allowed*here~optional*segment*~optional*segment*~";

$split = preg_split('/~(ST|IT1|TDS)/', $var, -1, PREG_SPLIT_DELIM_CAPTURE);

$blocks = array('ST' => array(), 'IT1' => array(), 'TDS' => array());

for($i = 1; $i < count($split); $i+=2)
{
    $blocks[$split[$i]][] = $split[$i] . $split[$i+1];
}

var_dump($blocks);

注意:

  1. 我在~之前添加了以便在分割
  2. 上更轻松
  3. 我将$ i作为1启动,因为第一次拆分将为空
  4. <强>结果

    array(3) {
      ["ST"]=>
      array(1) {
        [0]=>
        string(70) "ST*Any*Characters*are*allowed*here~optional*segment*~optional*segment*"
      }
      ["IT1"]=>
      array(3) {
        [0]=>
        string(53) "IT1*Any*Characters*are*allowed*here~optional*segment*"
        [1]=>
        string(35) "IT1*Any*Characters*are*allowed*here"
        [2]=>
        string(71) "IT1*Any*Characters*are*allowed*here~optional*segment*~optional*segment*"
      }
      ["TDS"]=>
      array(1) {
        [0]=>
        string(72) "TDS*Any*Characters*are*allowed*here~optional*segment*~optional*segment*~"
      }
    }