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

Последовательность в искровом sql находится в искровом разряде 1.6, его выбирается monotonically_increasing_id () из таблицы, из-за искры 1,6 выйдет

8
задан abernier 4 July 2009 в 23:08
поделиться

5 ответов

Простая и эффективная функция для решения этого

function attrString2Array($attr) {
  $atList = [];

  if (preg_match_all('/\s*(?:([a-z0-9-]+)\s*=\s*"([^"]*)")|(?:\s+([a-z0-9-]+)(?=\s*|>|\s+[a..z0-9]+))/i', $attr, $m)) {
    for ($i = 0; $i < count($m[0]); $i++) {
      if ($m[3][$i])
        $atList[$m[3][$i]] = null;
      else
        $atList[$m[1][$i]] = $m[2][$i];
    }
  }

  return $atList;
}

print_r(attrString2Array('<li data-tpl-classname="class" data-tpl-title="innerHTML" disabled nowrap href="#" hide src = "images/asas.gif">'));
print_r(attrString2Array('data-tpl-classname="class" data-tpl-title="innerHTML" disabled nowrap href="#" hide src = "images/asas.gif"'));

//Array
//(
//    [data-tpl-classname] => class
//    [data-tpl-title] => innerHTML
//    [disabled] => 
//    [nowrap] => 
//    [href] => #
//    [hide] => 
//    [src] => images/asas.gif
//)
0
ответ дан 3 November 2019 в 12:50
поделиться

You could use a regular expression to extract that information:

$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);

Now you just need to parse the classes of class (split at whitespaces) and property declarations of style (a little bit harder as it can contain comments and URLs with ; in it).

8
ответ дан 3 November 2019 в 12:50
поделиться

Вы не можете использовать обычный выражение для анализа 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 или sax parser .

4
ответ дан 3 November 2019 в 12:50
поделиться

Использовать SimpleXML:

<?php
$attribs = ' id= "header " class = "foo   bar" style ="background-color:#fff; color: red; "';

$x = new SimpleXMLElement("<element $attribs />");

print_r($x);

?>

Предполагается, что атрибуты всегда представляют собой пары имя / значение ...

20
ответ дан 3 November 2019 в 12:50
поделиться

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

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

http://simplehtmldom.sourceforge.net/

2
ответ дан 3 November 2019 в 12:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: