我有一个长字符串,由一系列由单个字符~
分隔的段组成。
示例:
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个部分:
ST
开始,直到第一次出现IT1
。IT1
开头并以下一个IT1
开头的字符串集合。TDS
开始直到字符串结尾的最后一个字符串。答案 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);
注意:
~
之前添加了以便在分割<强>结果强>
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*~"
}
}