preg_split使用带有delims数组的PREG_SPLIT_DELIM_CAPTURE

时间:2013-04-30 16:03:21

标签: php arrays preg-split

注意:我最近问了这个问题,但事实证明我正在寻找的解决方案比我最初的想法更先进。

使用preg_split,我该如何拆分它,请注意分隔符之前的字符串各不相同:

$string = "big red apple one purple grape some stuff then green apple yatta yatta red cherry green gape";

我想使用字符串数组作为分隔符,我希望它们包含在结果中。 Deliminters:[苹果,葡萄,樱桃]

我想要的输出是:

Array("big red apple", "one purple grape", "some stuff then green apple", "yatta yatta red cherry", "green grape");

这是我原来的:

$string = "big red apple one purple grape some stuff then green apple yatta yatta red cherry green gape";
$matches = preg_split('(apple|grape|cherry)', $string, -1, PREG_SPLIT_DELIM_CAPTURE);
print_r($matches);

打印出来: 数组([0] =>大红[1] =>一个紫色[2] =>一些东西然后绿色[3] => yatta yatta red [4] =>绿色gape)

没有分隔符。

2 个答案:

答案 0 :(得分:3)

如果你修改了输入字符串中最后一个单词的拼写错误,那么(一种可能的)模式是:

~(?<=apple|grape|cherry)\s*~

这是使用a look-behind然后拆分以下空格(如果存在)。所以它也适用于字符串的结尾。

完整示例:

<?php
/**
 * preg_split using PREG_SPLIT_DELIM_CAPTURE with an array of delims
 * @link http://stackoverflow.com/a/16304338/2261774
 */

$string = "big red apple one purple grape some stuff then green apple yatta yatta red cherry green grape";

var_dump(
    preg_split("~(?<=apple|grape|cherry)\s*~", $string, -1, PREG_SPLIT_NO_EMPTY)
);

See it in action.

正如您所看到的,我在这里没有使用PREG_SPLIT_DELIM_CAPTURE,因为我想要删除我拆分的空格。而是使用PREG_SPLIT_NO_EMPTY标志,以便我不会在字符串的末尾得到(空)分割。

答案 1 :(得分:0)

有点简单,结果相同:

$string = "big red apple one purple grape some stuff then green apple yatta yatta red cherry green grape";
$re='/\S.*?\s(?:apple|grape|cherry)/';
preg_match_all($re,$string,$m);
var_dump($m[0]);