我有一个看起来像这样的字符串:
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 :(得分:0)
您可以在preg_match_all
中使用此正则表达式:
$re = '/\d+(?=[^()]*[()])/';
RegEx分手:
\d+ # match 1 or more digits
(?= # lookahead start
[^()]* # match anything but ( or )
[()] # match ( or )
) # lookahead end
答案 1 :(得分:0)
你可以使用一个正则表达式来匹配括号外的数字块和"~(?<=\()\s*$numrx\s*(?=\))|\s*$numrx~"
里面的数字,其中$numrx
代表数字正则表达式(可以进一步增强)。
-?\d+(?:\s+-?\d+)*
匹配可选的-
,1位或更多位数,然后是0 + 1+个空格的序列,后跟可选的-
和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
)