PHP:split / explode不返回结果数组中的分隔符

时间:2015-03-22 12:32:50

标签: php regex

当前字符串:“m,d - y”。

我想用d,m和y分割/爆炸。

处理后我应该得到:

array[0] = "m";
array[1] = ", ";
array[2] = "d";
array[3] = " - ";
array[4] = "y";

怎么做?拆分和爆炸将从返回的数组中删除我的分隔符。

4 个答案:

答案 0 :(得分:1)

根据之前存在的边界(dmy)或dm之后存在的边界分割输入或y

$str = "m, d - y";
$match = preg_split('~(?<=[dmy])(?!$)|(?<!^)(?=[dmy])~m', $str);
print_r($match);

输出:

Array
(
    [0] => m
    [1] => , 
    [2] => d
    [3] =>  - 
    [4] => y
)

<强>解释

  • (?<=[dmy])立即关注[dmy]并且匹配(?!$)后面不会有行结束。这样可以避免匹配最后存在的边界。

  • (?=[dmy])匹配d或m或y之前存在的所有边界,但匹配不会在aline的开头。

答案 1 :(得分:0)

您可以使用preg_match_all并匹配分隔符和分隔符,但分隔符除外围有分隔符。

使用正则表达式/[dmy]|\s*[^dmy]\s*/

答案 2 :(得分:0)

preg_split支持选项PREG_SPLIT_DELIM_CAPTURE,其中包含最终结果中捕获的分隔符部分。

$result = preg_split('~([mdy])~', $str, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);

PREG_SPLIT_NO_EMPTY选项,从结果数组中删除空字符串。

答案 3 :(得分:0)

拆分和爆炸并不意味着返回分隔符。我说这里使用的最佳功能是preg_match:

http://php.net/manual/de/function.preg-match.php

因此,您可以定义括号中的字符组,这些字符应该得到&#34; grep&#39; d&#34;到结果数组的一个项目。

这里模式的基本思想是交替使用相同的字符组[ - ,],有或没有否定^。请注意,char - 需要一个转义\因为它在字符类[]中的特殊含义。

[编辑:今天学到了一些东西:preg_split有一个很酷的选择。感谢其他人提到这一点。现在有两种比较解决方案。]

<?php

$input = "m, d - y";

preg_match ("/([^ ,\-]+)([,\- ]+)([^ ,\-]+)([,\- ]+)([^ ,\-]+)/", $input, $result);
$result2 = preg_split ("/([\-\s,]+)/", $input, -1, PREG_SPLIT_DELIM_CAPTURE);
print ("<pre>");
var_dump ($result);
var_dump ($result2);
print ("</pre>");