note 71406 deleted from function.preg-match-all by colder
| From: | colder@php.net | Date: | Mon, 27 Nov 2006 17:57:42 +0000 |
| Subject: | note 71406 deleted from function.preg-match-all by colder | ||
| References: | 1 | Groups: | php.notes |
| Request: | Send a blank email to php-notes+get-120107@lists.php.net to get a copy of this message | ||
Note Submitter: Vladimir Kornea
----
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