regex - PHP not respecting non-capturing group with lookahead with a capturing group inside -


i have php regex match:

 preg_match_all('/(\d+)(?:\.(?=(\d+)))?/', "43.3", $matches, preg_set_order); 

which (at least in mi mind) means:

match 1 or more numbers group, , if there '.' after group followed group of numbers, match too, ignore '.'. 

so, possible strings be:

1 23244 24.5 2.454646 

but not:

1. 

now, works in regex101.com test string throw @ it, doesn't seem working php. if var_dump($matches):

array(2) {   [0]=>   array(3) {     [0]=>     string(3) "43."     [1]=>     string(2) "43"     [2]=>     string(1) "3"   }   [1]=>   array(2) {     [0]=>     string(1) "3"     [1]=>     string(1) "3"   } } 
  • why getting point after 43?
  • why getting duplicated?
  • why getting 3 inside first group?

the first match full match, though whole pattern wrapped in set of parentheses. don't think can turn off.

you're getting 3 in first group because you've got 2 (\d+)'s in pattern. remove parentheses 1 after ?= if don't want it.

if want full number, can try this:

>>> preg_match_all('/(?<!\d)\d+(?:\.\d+)?(?![\d.])/', "43.3 31.52 1.", $matches); => 2 >>> $matches => [        [            "43.3",            "31.52"        ]    ] 

if there's 1 number, should use preg_match, not preg_match_all. e.g.

>>> preg_match_all('/(\d+)(?:\.(\d+))?/', "43.3", $matches) => 1 >>> $matches => [        [            "43.3"        ],        [            "43"        ],        [            "3"        ]    ] 

you can array_shift off full match.


Comments

Popular posts from this blog

python - TypeError: start must be a integer -

c# - DevExpress RepositoryItemComboBox BackColor property ignored -

django - Creating multiple model instances in DRF3 -