2016-09-28 71 views
1

我有一個字符串,它看起來像這樣包含在我們的外括號內的數字的字符串:如何分割使用preg_match_all

535354 345356 3543674 34667 2345347 -3536 4532452 (234536 2345634 -4513453) (2345 -13254 13545) 

)(之間的文本始終是在字符串(至少在年底現在)。

我需要將其拆分成類似這樣的數組:

[0] => [0] 535354,345356,3543674,34667,2345347,-3536,4532452 
[1] => [0] 234536,2345634,-4513453 
    => [1] 2345,-13254,13545 

我應該使用什麼樣的表達式preg_match_all? 最好的我可以得到有限的知識是/([0-9]{1,}){1,}.*(?=(\(.*\)))/U但我仍然得到一些不需要的元素。

回答

0

您可以使用正則表達式將匹配括號外的數塊和那些在"~(?<=\()\s*$numrx\s*(?=\))|\s*$numrx~"裏面的$numrx代表fo r數字正則表達式(可以進一步增強)。

-?\d+(?:\s+-?\d+)*與可選的-,1個或更多數字匹配,然後匹配1+個空白的0+序列,然後是可選的-和1+數字。 (?<=\()\s*$numrx\s*(?=\))只有在前面(後跟)才匹配。

看到這個PHP代碼片段:

$s = "535354 345356 3543674 34667 2345347 -3536 4532452 (234536 2345634 -4513453) (2345 -13254 13545)"; 
$numrx = "-?\d+(?:\s+-?\d+)*"; 
preg_match_all("~(?<=\()\s*$numrx\s*(?=\))|\s*$numrx~", $s, $m); 
$res = array(); 
foreach ($m[0] as $k) { 
    array_push($res,explode(" ",trim($k))); 
} 
print_r($res); 

輸出:

[0] => Array                                      
    (                                       
     [0] => 535354                                    
     [1] => 345356                                    
     [2] => 3543674                                   
     [3] => 34667                                    
     [4] => 2345347                                   
     [5] => -3536                                    
     [6] => 4532452                                   
    )                                        

[1] => Array                                      
    (                                       
     [0] => 234536 
     [1] => 2345634                                   
     [2] => -4513453                                   
    )                                        

[2] => Array                                      
    (                                       
     [0] => 2345                                    
     [1] => -13254                                    
     [2] => 13545                                    
    )                                        
0

可以在preg_match_all使用正則表達式:

$re = '/\d+(?=[^()]*[()])/'; 

RegEx Demo

正則表達式破碎:

\d+  # match 1 or more digits 
(?=  # lookahead start 
    [^()]* # match anything but (or) 
    [()] # match (or) 
)   # lookahead end 
+0

@ user2490448:難道這項工作呢? – anubhava