Re: [pcre] backreferences to all matches of a repeated subexpression
| From: | Roberto Mansfield | Date: | Fri, 03 Aug 2007 18:16:38 +0000 |
| Subject: | Re: [pcre] backreferences to all matches of a repeated subexpression | ||
| References: | 1 | Groups: | php.general |
| Request: | Send a blank email to php-general+get-260142@lists.php.net to get a copy of this message | ||
Jack Bates wrote:
> 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
Perhaps this would be easier with preg_match_all() which allows you to
do a global match. Then traverse the resulting array matches. The square
brackets do make the problem a little tougher since you can get into
recursion.