<?php
$pattern ='/([^&]+)=([^=]+)(?=$|&[^=]+=)/';<br>
$test = array(
'name=Shake & Bake&difficulty=easy',
'name=Shake&Bake&difficulty=easy',
'difficulty=easy&name=Shake & Bake',
'difficulty=easy&name=Shake&Bake',
'name=Shake&Bake',
'difficulty=easy',
'name=Shake&Bake&foo&difficulty=easy',
'name=Shake&Bake&difficulty=easy&',
'name=Shake&Bake&difficulty='
);
foreach($test as $foo) {
preg_match_all($pattern, $foo, $m);
echo $foo, "\n";
for($i=0; $i<count($m[0]); $i++) {
echo ' ', $m[1][$i], ' =$gt; "', $m[2][$i], "\"\n";
}
echo "\n";
}
?>
производит
name=Shake & Bake&difficulty=easy
name => "Shake & Bake"
difficulty => "easy"<br>
name=Shake&Bake&difficulty=easy
name => "Shake&Bake"
difficulty => "easy"<br>
difficulty=easy&name=Shake & Bake
difficulty => "easy"
name => "Shake & Bake"<br>
difficulty=easy&name=Shake&Bake
difficulty => "easy"
name => "Shake&Bake"<br>
name=Shake&Bake
name => "Shake&Bake"<br>
difficulty=easy
difficulty => "easy"<br>
name=Shake&Bake&foo&difficulty=easy
name => "Shake&Bake&foo"
difficulty => "easy"<br>
name=Shake&Bake&difficulty=easy&
name => "Shake&Bake"
difficulty => "easy&"<br>
name=Shake&Bake&difficulty=
name => "Shake&Bake"
, который, кажется, работает (за исключением сложности = не соответствует в последнем примере).
Я не уверен, улучшит ли однократное соответствие подшаблона скорость. Возможно, вы захотите посмотреть это.