While this response wasn't the exact solution I was looking for, I want to say "Thank You". When I tried to simplify the problem for the devel list, I actually transposed a couple things wrong, ... so the double ++ was just a typo, and I also left of the style= part of the regex, which made Bevan's solution possible. But this convinced me to at put something in code, even if it was a few extra lines of code. BTW, this is for the http://drupal.org/project/nicedit. If anyone else is not quite satisfied with our wysiwyg editor options, please join me in working on this new editor option for Drupal. There are a couple of open problems documented on the project page, but I think that this is getting close to usable. Bevan Rudge wrote:
And testing with random whitespace;
$text = ' style=" font-style : italic ; font-weight : bold ; " '; $regex = "\s*([a-z][a-z0-9\-]*)\s*:\s*([a-z][a-z0-9\-]*)\s*;"; if (preg_match_all('/'. $regex .'/i', $text, $matches, PREG_SET_ORDER)) { print_r($matches); } $style = array(); foreach ($matches as $match) { $style[$match[1]] = $match[2]; } print_r($style);
works
Array
( [0] => Array ( [0] => font-style : italic ; [1] => font-style [2] => italic )
[1] => Array ( [0] => font-weight : bold ; [1] => font-weight [2] => bold )
) Array ( [font-style] => italic [font-weight] => bold )
Testing with commonly practiced and supported syntactical errors and irregularities;
$text = 'style=font-style:italic;font-weight:bold';
doesn't all work
Array ( [0] => Array ( [0] => font-style:italic; [1] => font-style [2] => italic ) ) Array ( [font-style] => italic )
It also doesn't work for non-textual properties, and property names starting with '-' exclude the '-';
$text = 'style=border-width: 0 2em 10px 0; border-left: 1px solid #000; -moz-border-radius: foo;';
outputs
Array ( [0] => Array ( [0] => moz-border-radius: foo; [1] => moz-border-radius [2] => foo )
) Array ( [moz-border-radius] => foo )
This regex deals with those issues (but not the missing trailing semicolon ';' $regex = "\s*([a-z\-][a-z0-9\-]*)\s*:\s*([^;]*)\s*;";
I'm not sure what the best way to deal with that is given the context. Perhaps something like
$text = 'font-style:italic;font-weight:bold'; $regex = "\s*([a-z\-][a-z0-9\-]*)\s*:\s*([^;]*)\s*"; $styles = explode(';', $text); $all_matches = array(); foreach($styles as $style) { if (preg_match('/'. $regex .'/i', $style, $matches)) { print_r($matches); $all_matches[] = $matches; } } $style = array(); foreach ($all_matches as $match) { $style[$match[1]] = $match[2]; } print_r($style);
Bevan/