Bug #73948 [Opn->Dup]: Preg_match_all should return empty strings on optional capture groups.
| From: | requinix@php.net | Date: | Mon, 16 Jan 2017 14:38:09 +0000 |
| Subject: | Bug #73948 [Opn->Dup]: Preg_match_all should return empty strings on optional capture groups. | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-206674@lists.php.net to get a copy of this message | ||
Edit report at https://bugs.php.net/bug.php?id=73948&edit=1
ID: 73948
Updated by: requinix@php.net
Reported by: tomasyorke at hotmail dot com
Summary: Preg_match_all should return empty strings on
optional capture groups.
-Status: Open
+Status: Duplicate
Type: Bug
-Package: *Regular Expressions
+Package: PCRE related
Operating System: Windows 7
PHP Version: 7.0.14
Block user comment: N
Private report: N
New Comment:
Duplicate of bug #61780, fixed in master. (unmatched groups will be NULL)
Previous Comments:
------------------------------------------------------------------------
[2017-01-16 14:24:55] tomasyorke at hotmail dot com
Description:
------------
Using preg_match_all with the PREG_SET_ORDER flag and an optional capture group might return either
an empty string or a missing element.
This depends on whether there is a matched capture group after the non-matched capture group.
From an interface perspective, this means that I have to check for two representations to test
whether an optional capture group was matched.
The test script demonstrates such a case.
When considering a fix, the first priority should be that whatever the representation is (NULL, an
empty string or a missing element.), it should be consistent, no matter if there is a matched
capture group after or not.
If this cannot be fixed due to backwards compatibility Issues. Could we add a PREG_KEEP_NONMATCHES
or PREG_SET_ORDER_2 flag?
Test script:
---------------
<?php
preg_match_all("#(a)?(b)(c)?#","b",$matches,PREG_SET_ORDER);
var_dump($matches);
Expected result:
----------------
array(1) {
[0] => array(3) {
[0] => string(1) "b" [1] => string(0) "" [2] => string(1)
"b" [3] => string(0) ""
}
}
Actual result:
--------------
array(1) {
[0] => array(3) {
[0] => string(1) "b" [1] => string(0) "" [2] => string(1)
"b"
}
}
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=73948&edit=1