• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 427
  • Last Modified:

preg_match_all returns false for first match

I am writing a calculator engine, and need to get the numbers and operators from the expression (a string). To do this I am using preg_match_all, with PREG_OFFSET_CAPTURE, that returns an array with all of the numbers and another with the operators. The operators part works fine, but the first matched number in the array is false instead of the number. Here is the function I am using:

$exp='13+4x2';
preg_match_all('/[0-9.\-\[]+/',$exp,$exp_nums,PREG_OFFSET_CAPTURE);

Open in new window


this returns:

array(1) {
  [0]=>
  array(3) {
    [0]=>
    array(2) {
      [0]=>
      bool(false) //improper value
      [1]=>
      int(1)
    }
    [1]=>
    array(2) {
      [0]=>
      string(1) "4"
      [1]=>
      int(4)
    }
    [2]=>
    array(2) {
      [0]=>
      string(1) "2"
      [1]=>
      int(6)
    }
  }
}

Open in new window


Does anyone know how to fix this
0
cloud-9
Asked:
cloud-9
  • 4
  • 2
2 Solutions
 
Terry WoodsIT GuruCommented:
How about this: (results below)

$exp='13+4x2';
preg_match_all('/[0-9.]+/','#'.$exp,$exp_nums,PREG_OFFSET_CAPTURE);
print_r($exp_nums);
Array
(
    [0] => Array
        (
            [0] => Array
                (
                    [0] => 13
                    [1] => 1
                )

            [1] => Array
                (
                    [0] => 4
                    [1] => 4
                )

            [2] => Array
                (
                    [0] => 2
                    [1] => 6
                )

        )

)

Open in new window

0
 
Terry WoodsIT GuruCommented:
Your code gives me this result actually, which seems different from what you're getting:
Array
(
    [0] => Array
        (
            [0] => Array
                (
                    [0] => 13
                    [1] => 0
                )

            [1] => Array
                (
                    [0] => 4
                    [1] => 3
                )

            [2] => Array
                (
                    [0] => 2
                    [1] => 5
                )

        )

)

Open in new window

0
 
Terry WoodsIT GuruCommented:
I'm not sure why you're trying to match - and [ characters in your pattern:
/[0-9.\-\[]+/

 but the backslashes need to have an extra escape character if you're going to try to do it:
/[0-9.\\-\\[]+/

However, with the code:
$exp='13+4x2-5-17';
preg_match_all('/[0-9.\\-\\[]+/',$exp,$exp_nums,PREG_OFFSET_CAPTURE);
print_r($exp_nums);

The result is probably not what you want:


Array
(
    [0] => Array
        (
            [0] => Array
                (
                    [0] => 13
                    [1] => 0
                )

            [1] => Array
                (
                    [0] => 4
                    [1] => 3
                )

            [2] => Array
                (
                    [0] => 2-5-17
                    [1] => 5
                )

        )

)

Open in new window

0
Never miss a deadline with monday.com

The revolutionary project management tool is here!   Plan visually with a single glance and make sure your projects get done.

 
Terry WoodsIT GuruCommented:
(My first suggestion solves that problem)
0
 
cloud-9Author Commented:
The - and ] characters denote a negative sign (a subtraction operator is _) and a fraction symbol such as on a scientific calculator (ex 2[5 means two fifths). "2-5-17" would  produce a syntax error on my calculator. But all of this is beside the point.

I discovered my error: I am using gmp_init to convert all of the numbers in the array. I forgot I was using a different array structure previously, and I was trying to convert an array into a gmp number. Apparently the failure of the first gmp_init broke the loop and the other values were not processed. The array I was var_dumping came after the failed gmp_init. So there was no problem with preg_match_all in the first place. Sorry for inconvenience.
0
 
cloud-9Author Commented:
I am still giving points for the prompt response.
0

Featured Post

The new generation of project management tools

With monday.com’s project management tool, you can see what everyone on your team is working in a single glance. Its intuitive dashboards are customizable, so you can create systems that work for you.

  • 4
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now