note 71406 added to function.preg-match-all

From: Date: Mon, 27 Nov 2006 16:14:27 +0000
Subject: note 71406 added to function.preg-match-all
Groups: php.notes 
Request: Send a blank email to php-notes+get-120103@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/71406 Del: integrated -- https://master.php.net/note/delete/71406/integrated Del: useless -- https://master.php.net/note/delete/71406/useless Del: bad code -- https://master.php.net/note/delete/71406/bad+code Del: spam -- https://master.php.net/note/delete/71406/spam Del: non-english -- https://master.php.net/note/delete/71406/non-english Del: in docs -- https://master.php.net/note/delete/71406/in+docs Del: other reasons-- https://master.php.net/note/delete/71406 Reject -- https://master.php.net/note/reject/71406 Search -- https://master.php.net/manage/user-notes.php

« previous php.notes (#120103) next »