Ok this is really difficult to explain in English, so I’ll just give an example.
I am going to have strings in the following format:
key-value;key1-value;key2-...
and I need to extract the data to be an array
array('key'=>'value','key1'=>'value1', ... )
I was planning to use regexp to achieve (most of) this functionality, and wrote this regular expression:
/^(\w+)-([^-;]+)(?:;(\w+)-([^-;]+))*;?$/
to work with preg_match and this code:
for ($l = count($matches),$i = 1;$i<$l;$i+=2) {
$parameters[$matches[$i]] = $matches[$i+1];
}
However the regexp obviously returns only 4 backreferences – first and last key-value pairs of the input string. Is there a way around this? I know I can use regex just to test the correctness of the string and use PHP’s explode in loops with perfect results, but I’m really curious whether it’s possible with regular expressions.
In short, I need to capture an arbitrary number of these key-value; pairs in a string by means of regular expressions.
You can use a lookahead to validate the input while you extract the matches:
(?=(?:\w++-[^;-]++;?)++$)is the validation part. If the input is invalid, matching will fail immediately, but the lookahead still gets evaluated every time the regex is applied. In order to keep it (along with the rest of the regex) in sync with the key-value pairs, I used\Gto anchor each match to the spot where the previous match ended.This way, if the lookahead succeeds the first time, it’s guaranteed to succeed every subsequent time. Obviously it’s not as efficient as it could be, but that probably won’t be a problem–only your testing can tell for sure.
If the lookahead fails,
preg_match_all()will return zero (false). If it succeeds, the matches will be returned in an array of arrays: one for the full key-value pairs, one for the keys, one for the values.