PHP正则表达式在括号之间获取浮点值

时间:2015-09-18 13:31:25

标签: php regex preg-match

从字符串中获取一些数字我有点问题。

例如我有这种str:

qweqeqe (qweqwe) AASD 213,21 ( -1201,77 EUR )

我需要括号之间带逗号的数字 结果:-1201,77 价值也可以是积极的。 我已经设法获得浮动值,但是从所有字符串。 我有这个:!\d+(?:\,\d+)?!但它获得了str中的所有数字。

2 个答案:

答案 0 :(得分:2)

如果在父母身上总共有1个号码......

这是一个两遍“可读”的方法:提取所有括号子串,然后使用preg_filter提取浮点值:

$s = "qweqeqe (qweqwe) AASD 213,21 ( -1201,77 EUR )";
preg_match_all('/\([^()]*\)/', $s, $parentheses);
$res = preg_filter('/.*?([+-]?\d+(?:,\d+)?).*/s', '$1', $parentheses[0]);
                     ^^^     ^

请参阅IDEONE demo

在这里,我们匹配浮动之前和之后的任何符号.*。请注意,为了保留数字,我们需要在左侧部分(.*?)中使用延迟点匹配,并且我们可以匹配数字后部分中的任何内容。由于数字前的+ / -是可选的,请使用?量词:[-+]?

如果父母身上的数字超过1个......

这是一种不太可读的一次通过方法:

$s = "qweqeqe (qweqwe) AASD 213,21 ( -1201,77 EUR )";
preg_match_all('/(?:\(|(?!^)\G)[^()]*?([+-]?\d+(?:,\d+)?)(?=[^()]*\))/', $s, $matches);
                                       ^^^^

请参阅another IDEONE demo

这里,正则表达式定义了(?:\(|(?!^)\G)的起始边界(即,在(之后开始查找数字,然后在每次成功匹配之后),然后使用[^()]*?(\d+(?:,\d+)?)捕获浮点数但要确保我们仍然在括号内(使用(?=[^()]*\))前瞻检查最右边界。)

答案 1 :(得分:0)

尝试这种模式:

$pattern = "#\([\s]*(-{0,1}[0-9]+,[0-9]+)[\s]*[A-Za-z]*[\s]*\)#";