PHP: HTML / XML Tag Attribute ermitteln

Dieser Codesnippet war ursprünglich ein Beispiel aus einem Forum, wo es darum ging die Attribute aller Img-Tags aus einem HTML Code auszulesen.

Ich habe den Code noch etwas erweitert und nun kann er allgemein genutzt werden, um die Attribute beliebiger Tags aus HTML oder XML Dokumenten zu ermitteln.

Die Funktion erwartet zwei Parameter. Als ersten den zu durchsuchenden Code und als zweiten optional eine Einschränkung auf bestimmte Tagnamen:

<?php
 
// HTML/XML Tag Attribute ermitteln 
function get_tag_attributes($code, $tag_search = false) {
  // Einzelnen Tagnamen in ein Array packen
  if ($tag_search && !is_array($tag_search)) {
    $tag_search = array($tag_search);
  }

  // Alle Tags auslesen
  $matches = array();
  preg_match_all('/<([a-z]*?) (.*?)\>/is', $code, $matches);

  // Funde durchlaufen und Attribute ermitteln
  $tags = array();
  foreach ($matches[1] as $key => $tag_name) {
    // Nicht zugelassene Tags überspringen
    if ($tag_search) {
      if (!in_array(strtolower($tag_name), $tag_search)) {
        continue;
      }
    }

    // Attribute austrennen
    $attributes = array();
    preg_match_all('/([a-z]*?)=(".*?"|\'.*?\')/is',
      $matches[2][$key], $attributes);

    // Attribute abspeichern
    $tag = array('tag' => $tag_name);
    foreach ($attributes[1] as $key => $value) {
      $tag[$value] = substr($attributes[2][$key], 1, -1);
    }
    $tags[] = $tag;
  }

  // Daten zurückgeben
  return $tags;
}
 
?>  

Ein Aufruf zur Suche nach Img-Tags in einem HTML Dokument könnte wie folgt aussehen:

<?php

// HTML Code für die Beispielaufrufe
$html_code = <<< CODE_BLOCK
<html>
<head>
  <title>Test</title>
</head>
<body>

  <img src="bild1.jpg" alt="img1" style="border:1px solid red" />

  <img src="bild2.jpg" alt="img2" style="border:1px solid green" />

  <div style="background-color:red">
  Test
  </div>

  <p style="color:red">Test</p>

</body>
</html>
CODE_BLOCK;

// Beispielaufruf 1: Nur Img-Tags durchsuchen
$tags get_tag_attributes($html_code'img');

// Array formatiert ausgeben
echo '<pre>'print_r($tags); echo '</pre>';

?>

Hier wurde als zweiter Parameter ein einzelner Tagname in einem String übergeben. Das zurückgegebene Array hat folgenden Aufbau:

Array
(
  [0] => Array
    (
      [tag] => img
      [src] => bild1.jpg
      [alt] => img1
      [style] => border:1px solid red
    )

  [1] => Array
    (
      [tag] => img
      [src] => bild2.jpg
      [alt] => img2
      [style] => border:1px solid green
    )
)

Alternativ kann als zweiter Parameter auch ein Array mit mehreren Tagnamen übergeben werden:

<?php

// Beispielaufruf 2: Nur Div- und P-Tags durchsuchen
$tags get_tag_attributes($html_code, array('div''p'));

?>

Sollen alle Tags durchsucht werden, so wird der zweite Parameter einfach komplett weggelassen:

<?php

// Beispielaufruf 3: Alle Tags durchsuchen
$tags get_tag_attributes($html_code);

?>