Still celebrating National IT Professionals Day with 3 months of free Premium Membership. Use Code ITDAY17

x
Solved

# preg_match_all returns false for first match

Posted on 2010-11-28
Medium Priority
403 Views
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);
``````

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)
}
}
}
``````

Does anyone know how to fix this
0
Question by:cloud-9
[X]
###### Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

• Help others & share knowledge
• Earn cash & points
• 4
• 2

LVL 35

Accepted Solution

Terry Woods earned 2000 total points
ID: 34227650

\$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
)

)

)
``````
0

LVL 35

Expert Comment

ID: 34227655
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
)

)

)
``````
0

LVL 35

Expert Comment

ID: 34227662
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
)

)

)
``````
0

LVL 35

Expert Comment

ID: 34227663
(My first suggestion solves that problem)
0

LVL 3

Assisted Solution

cloud-9 earned 0 total points
ID: 34235119
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

LVL 3

Author Closing Comment

ID: 34272890
I am still giving points for the prompt response.
0

## Featured Post

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Many old projects have bad code, but the budget doesn't exist to rewrite the codebase. You can update this code to be safer by introducing contemporary input validation, sanitation, and safer database queries.
There are times when I have encountered the need to decompress a response from a PHP request. This is how it's done, but you must have control of the request and you can set the Accept-Encoding header.