note 71407 added to function.preg-match-all

From: Date: Mon, 27 Nov 2006 16:17:19 +0000
Subject: note 71407 added to function.preg-match-all
Groups: php.notes 
Request: Send a blank email to php-notes+get-120104@lists.php.net to get a copy of this message
Note that preg_match_all() doesn't know how to handle named groups that have the same name even if they are defined in a way that prevents name conflicts: <? $pattern = '!(?:<input[^>]* name="(?P<name>[^"]+)"[^>] *value="(?P<value>[^"]+)"[^>]*>)|(?:<input[^>]* value="(?P<value>[^"]+)"[^>]* name="(?P<name>[^"]+)"[^>]*>)!s'; $subject = '<input type="hidden" name="john" value="male">'; $subject .= '<input type="hidden" value="female" name="susan">'; $subject .= '<input type="hidden" name="mary" value="female">'; $subject .= '<input type="hidden" value="male" name="michael">'; $subpatterns = array(); preg_match_all($pattern, $subject, $subpatterns); ?> This results in "Warning: preg_match_all(): Compilation failed: two named groups have the same name". The solution is to give the capture groups different names, and restructure the result yourself: <? $pattern = '!(?:<input[^>]* name="(?P<name1>[^"]+)"[^>] *value="(?P<value1>[^"]+)"[^>]*>)|(?:<input[^>]* value="(?P<value2>[^"]+)"[^>]* name="(?P<name2>[^"]+)"[^>]*>)!s'; $subject = '<input type="hidden" name="john" value="male">'; $subject .= '<input type="hidden" value="female" name="susan">'; $subject .= '<input type="hidden" name="mary" value="female">'; $subject .= '<input type="hidden" value="male" name="michael">'; $subpatterns = array(); preg_match_all($pattern, $subject, $subpatterns); $clean_subpatterns = array(); for($i=0; $i<count($subpatterns[0]); $i++) { $clean_subpatterns['name'][$i] = $subpatterns['name1'][$i] ? $subpatterns['name1'][$i] : $subpatterns['name2'][$i]; $clean_subpatterns['value'][$i] = $subpatterns['value1'][$i] ? $subpatterns['value1'][$i] : $subpatterns['value2'][$i]; } print_r($clean_subpatterns); ?> Output: Array ( [name] => Array ( [0] => john [1] => susan [2] => mary [3] => michael ) [value] => Array ( [0] => male [1] => female [2] => female [3] => male ) ) This applies to PHP Version 5.1.4 ---- Server IP: 64.71.164.2 Probable Submitter: 65.106.184.148 ---- Manual Page -- http://www.php.net/manual/en/function.preg-match-all.php Edit -- https://master.php.net/note/edit/71407 Del: integrated -- https://master.php.net/note/delete/71407/integrated Del: useless -- https://master.php.net/note/delete/71407/useless Del: bad code -- https://master.php.net/note/delete/71407/bad+code Del: spam -- https://master.php.net/note/delete/71407/spam Del: non-english -- https://master.php.net/note/delete/71407/non-english Del: in docs -- https://master.php.net/note/delete/71407/in+docs Del: other reasons-- https://master.php.net/note/delete/71407 Reject -- https://master.php.net/note/reject/71407 Search -- https://master.php.net/manage/user-notes.php

« previous php.notes (#120104) next »