Intereting Posts
Как получить время в PHP с точностью до наносекунды? PHP удаляет ссылки на определенный сайт, но сохраняет текст xdebug не активирует точку останова API Карт Google v3 – создание нескольких карт с маркерами на одной странице Symfony 2 Security: продолжает перезагружать данные у поставщика услуг? Разница между 2 временными метками – PHP Доступ к переменным $ _SERVER из командной строки $ _POST не содержит всех данных PHP: анализ разделенных запятыми значений между квадратными скобками в многомерном массиве Ошибка SplFileObject не открыла поток: нет такого файла или каталога Многомерный массив PHP MySQL – раскрывающееся меню Как решить ошибку PHP 'Примечание: массив для преобразования строк в …' Можно ли использовать функции store_result () и bind_result () с PHP PDO? Laravel Eloquent: лучший способ расчета общей цены Simplexml: синтаксический анализ HTML оставляет вложенные элементы внутри элемента с текстовым узлом

PHP – разбиение строки атрибутов HTML на индексированный массив

У меня есть строка с атрибутами 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 или саксовый парсер .

Может быть, это поможет вам. Что он делает.

  • Парсер HTML DOM, написанный на PHP5 +, позволяет вам легко манипулировать HTML!
  • Требовать PHP 5+.
  • Поддерживает недействительный HTML.
  • Найти теги на странице HTML с селекторами, как jQuery.
  • Извлечь содержимое из HTML в одну строку.

http://simplehtmldom.sourceforge.net/

Простым способом может быть также:

 $ atts_array = current ((array) new SimpleXMLElement ("<element $ attribs />"));