分成几个字符并将它们包含在各个部分中

时间:2011-04-30 18:13:02

标签: php regex split

我想在几个字符上分割字符串(+~>@,但我希望这些字符成为返回部分的一部分

我试过了:

$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函数或标志来执行此操作,或者我必须自己创建=(

4 个答案:

答案 0 :(得分:6)

您错过了限制参数的分配,这就是为什么它的返回率低于您的预期,请尝试:

$parts = preg_split('/\+|>|~|@/', $input, -1, PREG_SPLIT_OFFSET_CAPTURE);

答案 1 :(得分:6)

$parts = preg_split('/(?=[+>~@])/', $input);

See it

由于您希望分隔符成为下一个分割片段的一部分,因此分割点正好位于分隔符之前,这可以使用正面预测轻松完成。

(?=     : 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.