2012-11-28 56 views
0

與條件的字符串我有這樣分裂的正則表達式

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 
) 

是否有可能用正則表達式來做到這一點?

+0

您的第一個數組是沒有意義的,然後......哦,你的意思是,如果拆分「AB」後naxt字母按alfabetical順序? – Kamilos

+0

@Kamilos它,因爲在c之後還有另一個ab序列。 –

+0

>以及字符串'ab'後跟隨的任何字符,那麼最後3個字符是什麼? – Kamilos

回答

1

個人而言,我覺得它更容易匹配,而不是分裂的角度來考慮這個問題:

  1. 匹配一個(如果後隨b)
  2. 匹配B(如果它遵循)
  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; 
} 
+0

非常感謝傑克。我已經試過你的代碼,它工作的很好! – Teiv

1

爲什麼你想使用正則表達式? explode()就在你的衚衕裏。

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

如果您的字符串以ab開頭,您將得到一個空元素。要記住它,只需array_shift陣列!

+0

他想這樣做正則表達式 – Kamilos

+2

@Kamilos否,op是問是否可以用正則表達式 –

+0

正則表達式版本:'preg_match_all(「#ab([^ ab] +)#i」,$ k,$ results); '。絕對是過度殺傷。 –