|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2014-02-07 19:03 UTC] coolwust at gmail dot com
Description: ------------ --- From manual page: http://www.php.net/function.preg-match-all --- The code is from pcre manual, chapter 'NAMED SUBPATTERNS', line 6093: http://www.pcre.org/pcre.txt PREG_SET_ORDER: Output the same result as the manual expected. PREG_PATTERN_ORDER Output the wrong result. Please check example for details. Maybe the latest named capturing overwrite the previous result. Test script: --------------- $pattern = <<<'PATTERN' /(?xJ) (?<DN>Mon|Fri|Sun)(?:day)?| (?<DN>Tue)(?:sday)?| (?<DN>Wed)(?:nesday)?| (?<DN>Thu)(?:rsday)?| (?<DN>Sat)(?:urday)? / PATTERN; $subject = "Monday\nThursday"; $result1 = preg_match_all($pattern, $subject, $matches1, PREG_PATTERN_ORDER); $result2 = preg_match_all($pattern, $subject, $matches2, PREG_SET_ORDER); echo 'subject:'; var_dump($subject); echo 'pattern:'; var_dump($pattern); echo 'flag PREG_PATTERN_ORDER:'; var_dump($matches1); echo 'flag PREG_SET_ORDER:'; var_dump($matches2); Expected result: ---------------- subject: string 'Monday Thursday' (length=15) pattern: string '/(?xJ) (?<DN>Mon|Fri|Sun)(?:day)?| (?<DN>Tue)(?:sday)?| (?<DN>Wed)(?:nesday)?| (?<DN>Thu)(?:rsday)?| (?<DN>Sat)(?:urday)? /' (length=123) flag PREG_PATTERN_ORDER: array (size=7) 0 => array (size=2) 0 => string 'Monday' (length=6) 1 => string 'Thursday' (length=8) 'DN' => array (size=2) 0 => string 'Mon' (length=0) //Expected 1 => string 'Thu' (length=0) //Expected 1 => array (size=2) 0 => string 'Mon' (length=3) 1 => string '' (length=0) 2 => array (size=2) 0 => string '' (length=0) 1 => string '' (length=0) 3 => array (size=2) 0 => string '' (length=0) 1 => string '' (length=0) 4 => array (size=2) 0 => string '' (length=0) 1 => string 'Thu' (length=3) 5 => array (size=2) 0 => string '' (length=0) 1 => string '' (length=0) flag PREG_SET_ORDER: array (size=2) 0 => array (size=3) 0 => string 'Monday' (length=6) 'DN' => string 'Mon' (length=3) 1 => string 'Mon' (length=3) 1 => array (size=6) 0 => string 'Thursday' (length=8) 'DN' => string 'Thu' (length=3) 1 => string '' (length=0) 2 => string '' (length=0) 3 => string '' (length=0) 4 => string 'Thu' (length=3) Actual result: -------------- subject: string 'Monday Thursday' (length=15) pattern: string '/(?xJ) (?<DN>Mon|Fri|Sun)(?:day)?| (?<DN>Tue)(?:sday)?| (?<DN>Wed)(?:nesday)?| (?<DN>Thu)(?:rsday)?| (?<DN>Sat)(?:urday)? /' (length=123) flag PREG_PATTERN_ORDER: array (size=7) 0 => array (size=2) 0 => string 'Monday' (length=6) 1 => string 'Thursday' (length=8) 'DN' => array (size=2) 0 => string '' (length=0) //Wrong 1 => string '' (length=0) //Wrong 1 => array (size=2) 0 => string 'Mon' (length=3) 1 => string '' (length=0) 2 => array (size=2) 0 => string '' (length=0) 1 => string '' (length=0) 3 => array (size=2) 0 => string '' (length=0) 1 => string '' (length=0) 4 => array (size=2) 0 => string '' (length=0) 1 => string 'Thu' (length=3) 5 => array (size=2) 0 => string '' (length=0) 1 => string '' (length=0) flag PREG_SET_ORDER: array (size=2) 0 => array (size=3) 0 => string 'Monday' (length=6) 'DN' => string 'Mon' (length=3) 1 => string 'Mon' (length=3) 1 => array (size=6) 0 => string 'Thursday' (length=8) 'DN' => string 'Thu' (length=3) 1 => string '' (length=0) 2 => string '' (length=0) 3 => string '' (length=0) 4 => string 'Thu' (length=3) PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Sat Nov 01 12:00:01 2025 UTC |
> Maybe the latest named capturing overwrite the previous result. Yes, that is exactly what's happening. Consider the following simplified test script: preg_match_all( '/(?J)(?<match>foo)|(?<match>bar)/', 'foo bar', $matches, PREG_PATTERN_ORDER ); var_dump($matches); which outputs: array(4) { [0] => array(2) { [0] => string(3) "foo" [1] => string(3) "bar" } 'match' => array(2) { [0] => string(0) "" [1] => string(3) "bar" } [1] => array(2) { [0] => string(3) "foo" [1] => string(0) "" } [2] => array(2) { [0] => string(0) "" [1] => string(3) "bar" } } And actually, that behavior is pretty much to be expected when using duplicate named subpatterns in combination with preg_match_all() and PREG_PATTERN_ORDER. It seems to me that this is not a bug, but rather something that should be better documented.