0

我有一个这样的字符串

阿卡布达比夫

现在我想把它分成一个序列'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
)

可以用正则表达式这样做吗?

4

2 回答 2

1

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

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

如果您的字符串以 ab 开头,您将得到一个空元素。要补救它,只需array_shift数组!

于 2012-11-28T12:30:33.063 回答
1

就我个人而言,我发现从匹配而不是拆分的角度考虑这个问题更容易:

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

在代码中:

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;
}
于 2012-11-28T12:50:42.260 回答