由Regex拆分条件的字符串

时间:2012-11-28 12:23:04

标签: php regex string split

我有一个像这样的字符串

  

abcabdabeaf

现在我想将它拆分为'a','b'的序列,并且字符串'ab'之后的任何字符都会跟着这样

Array
(
    [0] => a
    [1] => b
    [2] => c
    [3] => a
    [4] => b
    [5] => d
    [6] => a
    [7] => b
    [8] => eaf
)

我目前的尝试是

$string = "abcabdabeaf";
$split = preg_split("/((?<=a)b)/", $string, -1, PREG_SPLIT_DELIM_CAPTURE);
print_r($split);

但结果是

Array
(
    [0] => a
    [1] => b
    [2] => ca
    [3] => b
    [4] => da
    [5] => b
    [6] => eaf
)

是否可以使用正则表达式?

2 个答案:

答案 0 :(得分:1)

为什么要使用正则表达式? explode()就在你的小巷里。

<?php $k = "abcabdefabcabcgfgdgdfabde";
var_dump(explode("ab",$k));
?>

如果你的字符串以ab开头,你将获得一个空元素。为了解决这个问题,简单的array_shift数组!

答案 1 :(得分:1)

我个人觉得在匹配而不是拆分方面更容易想到这个问题:

  1. 匹配a(如果后跟b)
  2. 匹配b(如果它跟随a)
  3. 匹配其他任何内容,直到遇到'ab'或字符串结尾
  4. 在代码中:

    preg_match_all('/a(?=b)|(?<=a)b|.*?(?=ab|$)/', $s, $matches);
    // note that $matches[0] has an empty array element at the end
    

    这也会起作用,虽然比我想要的更冗长:

    $final = array(); $first = true;
    foreach (explode('ab', $s) as $part) {
            if ($first) {
                    $first = false;
            } else {
                    $final[] = 'a';
                    $final[] = 'b';
            }
            $final[] = $part;
    }