我想在几个字符上分割字符串(+
,~
,>
和@
,但我希望这些字符成为返回部分的一部分
我试过了:
$parts = preg_split('/\+|>|~|@/', $input, PREG_SPLIT_DELIM_CAPTURE);
结果只有2个部分应该有5个,而split-char不是部分[1]的一部分。
我也尝试过:
$parts = preg_split('/\+|>|~|@/', $input, PREG_SPLIT_OFFSET_CAPTURE);
结果是1部分太少(4而不是5),最后部分包含分裂字符。
preg_split
中没有标记,结果几乎是完美的(尽可能多的部分),但所有的分裂字符都消失了。
示例:
$input = 'oele>boele@4 + key:type:id + *~the end'; // spaces should be ignored
$output /* should be: */
array( 'oele', '>boele', ' @4 ', '+ key:type:id ', '+ *', '~the end' );
是否有一个spl函数或标志来执行此操作,或者我必须自己创建=(
答案 0 :(得分:6)
您错过了限制参数的分配,这就是为什么它的返回率低于您的预期,请尝试:
$parts = preg_split('/\+|>|~|@/', $input, -1, PREG_SPLIT_OFFSET_CAPTURE);
答案 1 :(得分:6)
$parts = preg_split('/(?=[+>~@])/', $input);
由于您希望分隔符成为下一个分割片段的一部分,因此分割点正好位于分隔符之前,这可以使用正面预测轻松完成。
(?= : Start of positive lookahead
[+>~@] : character class to match any of your delimiters.
) : End of look ahead assertion.
有效地,您要求preg_split
在分隔符之前的点处拆分输入字符串。
答案 2 :(得分:0)
$parts = preg_split('/(\+|>|~|@)/', $input, PREG_SPLIT_OFFSET_CAPTURE);
以下是解释:http://www.php.net/manual/en/function.preg-split.php#94238
答案 3 :(得分:0)
Ben是对的。
只是为了添加他的回答,PREG_SPLIT_DELIM_CAPTURE
是一个值为2的常量,因此您得到2个拆分,类似地PREG_SPLIT_OFFSET_CAPTURE
的值为4.