PHP - bölünmüş HTML bir dize bir dizinlenmiş diziye bağlıyor

4 Cevap php

Ben HTML özelliklere sahip bir dize var:

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

Dizinlenmiş bir diziye bu dizeyi dönüştürmek için nasıl gibi:

array(
  'id' => 'header',
  'class' => array('foo', 'bar'),
  'style' => array(
    'background-color' => '#fff',
    'color' => 'red'
  )
)

bu yüzden HTML niteliklerini 2 takım birleştirme PHP array_merge_recursive işlevini kullanabilirsiniz.

Teşekkür ederim

4 Cevap

SimpleXML kullanın:

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

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

print_r($x);

?>

Bu nitelikler her zaman isim / değer çiftleri olduğunu varsayar ...

Siz bu bilgileri ayıklamak için normal bir ifade kullanabilirsiniz:

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

Şimdi sadece onunla görüş ve URL'ler içerebilir gibi style (biraz zor class (boşluklar da bölünmüş) ve özellik bildirimlerini sınıfları ayrıştırmak gerekir {[(2) }] içinde).

May be this helps you .. What it does ..

  • PHP5 + ile yazılmış bir HTML DOM ayrıştırıcı size çok kolay bir şekilde HTML işlemek izin!
  • PHP 5 + gerektirir.
  • Geçersiz HTML desteği.
  • Sadece jQuery gibi seçiciler ile bir HTML sayfası üzerinde etiketleri bulun.
  • Tek satırda HTML içeriğini ayıklayın.

http://simplehtmldom.sourceforge.net/

Sen html özelliklerini ayrıştırmak için normal bir ifade kullanamazsınız. Sözdizimi bağlamsal olmasıdır. Sen giriş tokenize için düzenli ifadeleri kullanabilirsiniz, ama bunu ayrıştırmak için bir devlet makine gerekir.

Performans büyük bir anlaşma değil, bunu yapmak için en güvenli yolu, bir etiketi özelliklerini sarın ve daha sonra bir html çözümleyici aracılığıyla göndermek için muhtemelen. Örn.:

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;
}

Muhtemelen ayrıştırıcı yeniden tarafından, yukarıdaki optimize veya XmlReader veya sax parser ile olabilir.