Wie Beispiel 1.
Hier wird zusätzlich versucht die Erkennung etwas fehlertoleranter zu gestalten.
Es sollen auch Attribute welche Whitespace enthalten und nicht in Anführungen eingeschlossen sind richtig erkannt werden.
Also z.B. etwas wie
name = peter pan border = 1
Der Trick dabei ist den String vor der Auswertung umzudrehen (reverse).
<?php
function getAttributes($s)
{
$s = strrev($s);
$stack = array();
$reg_exp = '#\s?(?:"([^"]*)"|\'([^\']+)\'|([^=]+))\s?=\s?(\w*)#';
$success = preg_match_all($reg_exp, $s, $matches);
if (!$success) {
return false;
}
$n = count($matches[1]);
for ($i=0; $i < $n; $i++){
$match2use = !empty($matches[1][$i])
? $matches[1][$i]
: (!empty($matches[2][$i])
? $matches[2][$i]
: $matches[3][$i]);
$key = strrev($matches[4][$i]);
$value = strrev($match2use);
$stack[$key] = $value;
}
return $stack;
}
$test = array(
'border = "1"',
"border = '1'",
'border = 1',
'single=\'1\' double="2" noquotes = 3 ',
'a = 12 b = c d = "1" e=\'"test"\'',
'more="hattu=12"',
'name = peter pan border="12"',
);
foreach ($test as $s){
printf ('<h1>%s</h1>', $s);
$arr = getAttributes($s);
print_r($arr);
}
?>