1

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

例子:

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*
}

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

问题是我只能保证这些段(ST, IT1, TDS)的开头是强制性的,但它们后面可能跟着随机数量的可选段。

当然,分隔符~可能只出现在段之间而不是在段内。

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

  1. 从 开始ST直到第一次出现的字符串IT1
  2. IT1以 next 开始和结束的字符串集合IT1
  3. 最后的字符串从字符串开始TDS直到字符串的结尾。
4

1 回答 1

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. 我开始 $i 为 1 因为第一个拆分将是空的

结果

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*~"
  }
}
于 2012-10-23T12:17:46.907 回答