Bug #80276 [Opn->Ver]: (PATTERN_ORDER) Dupl named groups (?J) prefer last alternative even not matched

From: 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

« previous php.bugs (#229941) next »