0

我试图在使用时包含分隔符,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括号中,所以我不知道为什么这不起作用。

4

2 回答 2

6

您当前的方法不起作用,因为这里的“带括号的表达式”是指捕获组,并且?:启动您的组使其成为非捕获组。因此,您可以fy通过将表达式更改为 来获得包含/(fy)/,但我认为这不是您想要的,因为您将获得一个包含fy13 epsfy和的数组14 eps(括号中的表达式是结果中的单独条目)。

相反,请尝试以下操作:

print_r(preg_split('/(?=fy)/', 'fy13 eps fy14 rev', -1, PREG_SPLIT_NO_EMPTY));

fy这使用前瞻在字符串中每次出现之前进行拆分。

于 2013-06-13T20:34:28.137 回答
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. 这里是原子团
  2. 这里是所有格量词
于 2013-06-13T21:56:18.490 回答