PHP preg_split(包含分隔符)

时间:2013-06-13 20:23:14

标签: php regex

我在尝试使用preg_split时包含分隔符,但未成功。

print_r(preg_split('/((?:fy)[.]+)/', 'fy13 eps fy14 rev', -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY));

我想回来:

array(
    [0] => fy13 eps
    [1] => fy14 rev
)

将flags参数设置为PREG_SPLIT_DELIM_CAPTURE

  

如果设置了此标志,则将捕获并返回分隔符模式中带括号的表达式。

fy在括号中,所以我不知道为什么这不起作用。

2 个答案:

答案 0 :(得分:6)

您当前的方法无效,因为此处的“括号表达式”指的是捕获组,启动组的?:使其成为非捕获组。因此,您可以通过将表达式更改为fy来获取/(fy)/,但我不认为这是您想要的,因为您将获得包含fy,{{1 },13 epsfy(带括号的表达式是结果中的单独条目)。

相反,请尝试以下方法:

14 eps

这使用前瞻功能在字符串中每次出现print_r(preg_split('/(?=fy)/', 'fy13 eps fy14 rev', -1, PREG_SPLIT_NO_EMPTY)); 之前进行拆分。

答案 1 :(得分:0)

根据您提供的示例,我不确定您是否确实需要使用 preg_split 功能。例如,您可以通过更有效的方式(从性能的角度)获得与 preg_match_all 相同的内容:

preg_match_all('/fy(?>[^f]++|f++(?!y\d))*/', 'fy13 eps fy14 rev', $results);
print_r($results);

此处的想法是匹配fy后跟所有字符,但f匹配一次或多次,或f不跟y全部归零次。

分别有关(?>..)++的更多信息:

  1. here原子组
  2. 占有量词的
  3. here