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

From: Date: Fri, 23 Oct 2020 14:32:46 +0000
Subject: Bug #80276 [Opn]: (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-229879@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
 User updated by:    vicreal at yandex dot ru
 Reported by:        vicreal at yandex dot ru
 Summary:            (PATTERN_ORDER) Dupl named groups (?J) prefer last
                     alternative even not matched
 Status:             Open
 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:

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


Previous Comments:
------------------------------------------------------------------------
[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


Thread (3 messages)

« previous php.bugs (#229879) next »