2014-12-07 36 views
0

我有這個字符串。以下字符串的PHP RegEx

130003 lebtro is cool 609664 trochanter2 460936 bibi95 410635 MrRadical38 206311 Labonte 577767 thebanzaikid 569248 marco 355894 Armored_J 630259 SNEG323 569014 llama 5plummer 305212 lonefish 294268 dragonbleed 399281 Stelomat 619909 McPred 22733 Storykeeper 634691 The Max 504980 MrFrench 248285 Darkshadow2013 647361 Cain 

而且我希望能夠解析這樣的數字,然後像這樣的信件:

130003 lebtro is cool<br> 
609664 trochanter2<br> 
460936 bibi95<br> 
410635 MrRadical38<br> 
206311 Labonte<br> 
...<br> 
...<br> 
...<br> 
647361 Cain 

我是否需要在PHP中使用正則表達式或有任何其他方式做它?

回答

1

以使preg_split:

$result = preg_split('~\s*\b(?=[0-9])~', $str, -1, PREG_SPLIT_NO_EMPTY); 

以上防水:

$result = preg_split('~(?:\s|\A)\s*(?=[0-9])~', $str, -1, PREG_SPLIT_NO_EMPTY); 

或者爲什麼不模式:

$result = preg_split('~(?:\s+|\A\s*)(*SKIP)(?=[0-9])~', $str, -1, PREG_SPLIT_NO_EMPTY); 

沒有正則表達式:

$elts = explode(' ', $str); 

$result = array(); 
$tmp = ''; 

foreach ($elts as $elt) { 
    if (ctype_digit($elt)) { 
     if ($tmp) $result[] = $tmp; 
     $tmp = $elt; 
    } else 
     $tmp .= ' ' . $elt; 
} 
$result[] = $tmp; 
1

這裏有一個正則表達式的解決方案:

\b(\d+)\s+(.+?(?=\s+\d|$)) 

Demo

您可以preg_match_all使用。每場比賽將包含第一組中的號碼和第二組中的值。

像這樣的東西應該做的工作:

preg_match_all('#\b(\d+)\s+(.+?(?=\s+\d|$))#', $input, $matches, PREG_SET_ORDER); 

// $matches[0][1] == "130003" 
// $matches[0][2] == "lebtro is cool" 
// $matches[1][1] == "609664" 
// $matches[2][2] == "trochanter2" 

通過這一解決方案,任何空格分隔數字被視爲一個條目開始。如果您的所有號碼都是6位數字,則將\d+替換爲\d{6}(或\d{6,}代表至少6位數字)。