Re: [pcre] backreferences to all matches of a repeated subexpression

From: 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.

« previous php.general (#260142) next »