Bug #80276 [Opn->Ver]: (PATTERN_ORDER) Dupl named groups (?J) prefer last alternative even not matched
| From: | nikic@php.net | Date: | Tue, 27 Oct 2020 11:11:01 +0000 |
| Subject: | Bug #80276 [Opn->Ver]: (PATTERN_ORDER) Dupl named groups (?J) prefer last alternative even not matched | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-229941@lists.php.net to get a copy of this message | ||
Edit report at https://bugs.php.net/bug.php?id=80276&edit=1
ID: 80276
Updated by: nikic@php.net
Reported by: vicreal at yandex dot ru
Summary: (PATTERN_ORDER) Dupl named groups (?J) prefer last
alternative even not matched
-Status: Open
+Status: Verified
Type: Bug
Package: PCRE related
Operating System: Debian 10 x64 (4.19.132-1)
PHP Version: 7.4.11
Block user comment: N
Private report: N
New Comment:
I can confirm the bug, but it looks hard to fix. Would require merging result sets after the fact,
where we don't even have definite information on whether a group matched or was just
incidentally empty.
Previous Comments:
------------------------------------------------------------------------
[2020-10-23 14:32:46] vicreal at yandex dot ru
Another example:
preg_match_all('/(?J)<(?<CHAR>\d+)>|<(?<CHAR>\w+)>/u', '1
<01> 2 <PP> 3', $matches, PREG_PATTERN_ORDER);
Actual result:
--------------
Array
(
[0] => Array
(
[0] => "<01>"
[1] => "<PP>"
)
[CHAR] => Array
(
[0] => "" // must be "01"
[1] => "PP"
)
[1] => Array
(
[0] => "01"
[1] => ""
)
[2] => Array
(
[0] => ""
[1] => "PP"
)
)
Сhecked in version 7.4.10
------------------------------------------------------------------------
[2020-10-23 14:25:58] vicreal at yandex dot ru
Description:
------------
Affect named capture groups when duplicate names are enabled (?J) In 7.4.10 named capture group
always returns the content captured in last alternative, no matter which of the alternatives
matched.
In 7.4 this issue
https://bugs.php.net/bug.php?id=79257
was fixed only for PREG_SET_ORDER mode, but in PREG_PATTERN_ORDER mode this bug still has a place.
Сhecked in version 7.4.10
Test script:
---------------
preg_match_all('/(?J)(?:(?<g>foo)|(?<g>bar))(?<h>baz)/',
'foobaz', $matches, PREG_PATTERN_ORDER);
var_dump($matches);
Expected result:
----------------
Array
(
[0] => Array
(
[0] => "foobaz"
)
[g] => Array
(
[0] => "foo"
)
[1] => Array
(
[0] => "foo"
)
[2] => Array
(
[0] => ""
)
[h] => Array
(
[0] => "baz"
)
[3] => Array
(
[0] => "baz"
)
)
Actual result:
--------------
Array
(
[0] => Array
(
[0] => "foobaz"
)
[g] => Array
(
[0] => ""
)
[1] => Array
(
[0] => "foo"
)
[2] => Array
(
[0] => ""
)
[h] => Array
(
[0] => "baz"
)
[3] => Array
(
[0] => "baz"
)
)
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=80276&edit=1