[pcre] backreferences to all matches of a repeated subexpression
| From: | Jack Bates | Date: | Thu, 02 Aug 2007 03:05:09 +0000 |
| Subject: | [pcre] backreferences to all matches of a repeated subexpression | ||
| Groups: | php.general | ||
| Request: | Send a blank email to php-general+get-260040@lists.php.net to get a copy of this message | ||
I'm trying to pull all the components out of strings structured like:
word followed by any number of ( dot word or square bracketed string )
This is an example: foo.bar[ab.cd].baz
From the above example, I want: array('foo', 'bar', 'ab.cd',
'baz');
A regular expression to match these strings, including parenthesis
around the parts I want to pull out:
preg_match('/(^\w+)(?:\.(\w+)|\[([^]]+)\])*/', $subject, $matches);
However applied to the above example:
$matches[1] = 'foo'; // First subexpression
$matches[2] = 'baz'; // Last value of second subexpression
$matches[3] = 'ab.cd'; // Last value of third subexpression
I'm not sure how to get an array of all subexpression matches, in the
order matches appear in the subject, instead of the order expressions
appear in the pattern.
I think I might be able to do something using the Perl (?{code})
construction, e.g. ...(?:\.(\w+)(?{$parts[] = \2})|\[([^]]+)(?{$parts[]
= \3})\])*... but I haven't thought about it too much because PHP
doesn't support this construction.
Any ideas much appreciated. Thanks, Jack