У меня есть строка с атрибутами HTML:
$attribs = ' id= "header " class = "foo bar" style ="background-color:#fff; color: red; "';
Как преобразовать эту строку в индексированный массив, например:
array( 'id' => 'header', 'class' => array('foo', 'bar'), 'style' => array( 'background-color' => '#fff', 'color' => 'red' ) )
поэтому я могу использовать функцию PHP array_merge_recursive для объединения двух наборов атрибутов HTML.
спасибо
Использовать SimpleXML:
<?php $attribs = ' id= "header " class = "foo bar" style ="background-color:#fff; color: red; "'; $x = new SimpleXMLElement("<element $attribs />"); print_r($x); ?>
Это предполагает, что атрибуты всегда являются парами имя / значение …
Вы можете использовать регулярное выражение для извлечения этой информации:
$attribs = ' id= "header " class = "foo bar" style ="background-color:#fff; color: red; "'; $pattern = '/(\\w+)\s*=\\s*("[^"]*"|\'[^\']*\'|[^"\'\\s>]*)/'; preg_match_all($pattern, $attribs, $matches, PREG_SET_ORDER); $attrs = array(); foreach ($matches as $match) { if (($match[2][0] == '"' || $match[2][0] == "'") && $match[2][0] == $match[2][strlen($match[2])-1]) { $match[2] = substr($match[2], 1, -1); } $name = strtolower($match[1]); $value = html_entity_decode($match[2]); switch ($name) { case 'class': $attrs[$name] = preg_split('/\s+/', trim($value)); break; case 'style': // parse CSS property declarations break; default: $attrs[$name] = $value; } } var_dump($attrs);
Теперь вам просто нужно разобрать классы class
(split at whitespaces) и объявления свойств style
(немного сложнее, так как в нем могут содержаться комментарии и URL-адреса).
Вы не можете использовать регулярное выражение для анализа html-атрибутов. Это связано с тем, что синтаксис является контекстуальным. Вы можете использовать регулярные выражения для токенизации ввода, но для его анализа нужен конечный автомат.
Если производительность не имеет большого значения, это самый безопасный способ сделать это, возможно, чтобы обернуть атрибуты в теге, а затем отправить его через парсер html. Например.:
function parse_attributes($input) { $dom = new DomDocument(); $dom->loadHtml("<foo " . $input. "/>"); $attributes = array(); foreach ($dom->documentElement->attributes as $name => $attr) { $attributes[$name] = $node->value; } return $attributes; }
Вероятно, вы могли бы оптимизировать вышеупомянутое, повторно используя парсер или используя XmlReader или саксовый парсер .
Может быть, это поможет вам. Что он делает.
Простым способом может быть также:
$ atts_array = current ((array) new SimpleXMLElement ("<element $ attribs />"));