php - regexp - match numbers with two decimals and thousand seperator -
http://www.tehplayground.com/#0qrtozth3
$inputs = array( '2', // no match '29.2', // no match '2.48', '8.06.16', // no match '-2.41', '-.54', // no match '4.492', // no match '4.194,32', '39,299.39', '329.382,39', '-188.392,49', '293.392,193', // no match '-.492.183,33', // no match '3.492.249,11', '29.439.834,13', '-392.492.492,43' ); $number_pattern = '-?(?:[0-9]|[0-9]{2}|[0-9]{3}[\.,]?)?(?:[0-9]|[0-9]{2}|[0-9]{3})[\.,][0-9]{2}(?!\d)'; foreach($inputs $input){ preg_match_all('/'.$number_pattern.'/m', $input, $matches); print_r($matches); }
it seems looking
$number_pattern = '-?(?<![\d.,])\d{1,3}(?:[,.]\d{3})*[.,]\d{2}(?![\d.])';
see php demo , regex demo.
the anchors not used, there lookarounds on both sides of pattern instead.
pattern details:
-?
- optional hyphen(?<![\d.,])
- there cannot digit, comma or dot befire current location -\d{1,3}
- 1 3 digits(?:[,.]\d{3})*
- 0 or more sequences of comma or dot followed 3 digits[.,]
- comma or dot\d{2}
- 2 digits are(?![\d.])
- not followed digit or dot.
note in php, not need specify /m
multiline mode , use $
end of string anchor,
preg_match_all('/'.$number_pattern.'/', $input, $matches);
is enough match numbers need in larger texts.
if need match them standalone strings, use simpler
^-?\d{1,3}(?:[,.]\d{3})*[.,]\d{2}$
see regex demo.
Comments
Post a Comment