Extrae atributos de HTML en PHP con expresiones regulares

Quiero obtener atributos de HTML de cadena con PHP pero fallar con:

$string = '
    '; preg_filter("/(\w[-\w]*)=\"(.*?)\"/", '$1', $string ); // returns "<ul id name custom-tag" preg_filter("/(\w[-\w]*)=\"(.*?)\"/", '$1', $string ); // returns "<ul value Bob customData"

Lo que quiero devolver es:

 array( 'id' => 'value', 'name' => 'Bob', 'custom-tag' => 'customData' ); 

HTML no es un lenguaje normal y no se puede analizar correctamente con una expresión regular. Use un analizador DOM en su lugar. Aquí hay una solución que usa la clase DOMDocument incorporada de DOMDocument :

 $string = '
    '; $dom = new DOMDocument(); $dom->loadHTML($string); $result = array(); $ul = $dom->getElementsByTagName('ul')->item(0); if ($ul->hasAttributes()) { foreach ($ul->attributes as $attr) { $name = $attr->nodeName; $value = $attr->nodeValue; $result[$name] = $value; } } print_r($result);

Salida:

 Array ( [id] => value [name] => Bob [custom-tag] => customData ) 

No use expresiones regulares para analizar HTML

 $string = '
    '; $dom = new DOMDocument(); @$dom->loadHTML($string); $ul = $dom->getElementsByTagName('ul')->item(0); echo $ul->getAttribute("id"); echo $ul->getAttribute("name"); echo $ul->getAttribute("custom-tag");