2016-09-28 85 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