note 71406 added to function.preg-match-all
| From: | VladimirKornea at osu1 dot php dot net | 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