Funktion htmlspecialchars() - HTML-Spezifische Zeichen umwandeln

In HTML haben manche Zeichen wie die spitzen Klammern < > eine besondere Bedeutung und werden daher als HTML-Entities geschrieben, wenn sie als Text dargestellt werden sollen, z.B. &lt; statt < und &gt; statt >. Bei der Verarbeitung von Zeichenketten kann es vorkommen, dass solch spezifische Zeichen enthalten sind und daher umgewandelt werden müssen. Das kann z.B. notwendig sein, wenn man den Usern eine Eingabemöglichkeit über ein Formular bereitstellt und verhindern möchte, dass sie darüber HTML-Code einschleusen. Um das zu verhindern, kann man die Funktion htmlspecialchars() verwenden, die dafür sorgt, dass die Zeichen, die in HTML eine besondere Bedeutung haben, umgewandelt werden. Innerhalb der runden Klammern werden die Parameter wie folgt angegeben.

  1. Die Zeichenkette, auf die die Funktion angewendet wird (string).
  2. flag-Konstanten, um z.B. anzugeben, ob Anführungszeichen umgewandelt werden sollen (int, optional).
  3. Zeichenkodierung (encoding, optional).
  4. Boolescher Wert, mit dem festgelegt wird, ob bereits vorhandene Entities berücksichtigt werden sollen (bool, optional).

Anders als bei der Funktion htmlentities() werden mit htmlspecialchars() nur die folgenden Zeichen umgewandelt.

  • < wird zu &lt;
  • > wird zu &gt;
  • & wird zu &amp;
  • " wird zu &quot; (abhängig von flag-Konstanten)
  • ' wird zu &#039; (abhängig von flag-Konstanten)

Umlaute werden nicht umgewandelt. Bei den Anführungszeichen hängt es davon ab, ob mit dem zweiten Parameter eine flag-Konstante gesetzt wurde. In der Standardeinstellung werden doppelte Anführungszeichen umgewandelt und einfache nicht.

<?php

$str = 'ä ö ü ß < > & " \'';
$str = htmlspecialchars($str);

// Ausgabe ä ö ü ß < &gt; &amp; &quot; '
echo $str;

?>

flag-Konstanten

Über die folgenden flag-Konstanten hat man Möglichkeiten zur Beeinflussung der Funktion.

  • ENT_COMPAT: Ist die Standardeinstellung, sodass nur doppelte Anführungszeichen umgewandelt werden.
  • ENT_QUOTES: Doppelte und einfache Anführungszeichen werden umgewandelt.
  • ENT_NOQUOTES: Beide Arten von Anführungszeichen werden nicht umgewandelt.
  • ENT_IGNORE: Falls gewisse Code-Sequenzen nicht gültig sind, werden sie ignoriert, anstatt die Funktion einen leeren String zurückgeben zu lassen. Die Nutzung sollte man vermeiden, da es ein Sicherheitsrisiko darstellt.
  • ENT_SUBSTITUTE: Wenn Zeichen-Codes für die Zeichenkodierung nicht gültig sind, werden sie in Unicode (UTF-8) mit U+FFFD oder &#FFFD (falls nicht Unicode) ersetzt.
  • ENT_HTML401: Behandelt den Code als HTML 4.01.
  • ENT_XML1: Behandelt den Code als XML 1.
  • ENT_XHTML: Behandelt den Code als XHTML.
  • ENT_HTML5: Behandelt den Code als HTML5.
  • ENT_DISALLOWED: Falls Code-Sequenzen für den angegebenen Doctype ungültig sind, werden diese in Unicode (UTF-8) mit U+FFFD oder &#FFFD (falls nicht Unicode) ersetzt.

Mit dem folgenden Code kann der Effekt von ENT_QUOTES getestet werden.

<?php

$str = '< > & " \'';
$str = htmlspecialchars($str, ENT_QUOTES);

// Ausgabe &lt; &gt; &amp; &quot; &#039;
echo $str;

?>

Mit ENT_NOQUOTES werden beide Anführungszeichen nicht umgewandelt.

<?php

$str = '< > & " \'';
$str = htmlspecialchars($str, ENT_NOQUOTES);

// Ausgabe &lt; &gt; &amp; " '
echo $str;

?>

Mehrere flag-Konstanten können mit einem | (Pipe) getrennt angegeben werden. Das Verhalten bei ungültigen HTML-Codes (\x80 ungültig in UTF-8) kann man mit folgendem Code testen.

<?php

$str = "< > \x80 & \" '";
$str = htmlspecialchars($str, ENT_QUOTES);

// Ausgabe
echo $str;


$str = "< > \x80 & \" '";
$str = htmlspecialchars($str, ENT_QUOTES | ENT_IGNORE);

// Ausgabe &lt; &gt;  &amp; &quot; &#039;
echo $str;


$str = "< > \x80 & \" '";
$str = htmlspecialchars($str, ENT_QUOTES | ENT_SUBSTITUTE);

// Ausgabe &lt; &gt; � &amp; &quot; &#039;
echo $str;

?>

In HTML 4.01 gab es die Entität &apos; für ein einfaches Anführungszeichen nicht. Daher wird es mit der flag-Konstante ENT_HTML401 zu &#039; umgewandelt, sofern ENT_QUOTES ebenfalls gesetzt ist.

<?php

$str = '< > & " \'';
$str = htmlspecialchars($str, ENT_QUOTES | ENT_HTML401);

// Ausgabe &lt; &gt; &amp; &quot; &#039;
echo $str;

?>

Mit ENT_XML1, ENT_XHTML und ENT_HTML5 wird ein einfaches Anführungszeichen zu &apos;.

<?php

$str = '< > & " \'';
$str = htmlspecialchars($str, ENT_QUOTES | ENT_XML1);

// Ausgabe &lt; &gt; &amp; &quot; &apos;
echo $str;


$str = '< > & " \'';
$str = htmlspecialchars($str, ENT_QUOTES | ENT_XHTML);

// Ausgabe &lt; &gt; &amp; &quot; &apos;
echo $str;


$str = '< > & " \'';
$str = htmlspecialchars($str, ENT_QUOTES | ENT_HTML5);

// Ausgabe &lt; &gt; &amp; &quot; &apos;
echo $str;

?>

Zeichenkodierung

Mit dem dritten Parameter wird die Zeichenkodierung angegeben. Wenn es ausgelassen wird, dann gilt ab der PHP-Version 5.6 der Wert, der in der Konfigurationsdatei php.ini unter default_charset angegeben wurde. In den Versionen davor ist die Standardeinstellung UTF-8 und vor PHP 5.4 ist es ISO-8859-1. Damit man die PHP-Dateien auf unterschiedlichen Servern laufen lassen kann, sollte man auf die Angabe nicht verzichten. In dem Fall erwartet der PHP-Interpreter trotzdem als zweiten Parameter eine flag-Konstante, den man mit ENT_COMPAT auf Standard setzen kann, wenn es davon nicht abweichen soll.

<?php

$str = '< > & " \'';
$str = htmlspecialchars($str, ENT_COMPAT, 'UTF-8');

// Ausgabe &lt; &gt; &amp; &quot; '
echo $str;

?>

Bearbeitung bereits vorhandener Entities

In einer Zeichenkette können bereits HTML-Entities vorhanden sein. Da mit htmlspecialchars() auch das Und-Zeilchen & umgewandelt wird, kann es passieren, dass die vorhandenen Entities ungültig werden. Um das zu verhindern, kann man den 4. Parameter auf false setzen. Dann sind bereits vorhandene HTML-Entities von der Umwandlung nicht betroffen. Die Standardeinstellung ist true. Den Effekt kann man mit dem folgenden Code testen.

<?php

$str = '&lt; &gt; &amp; &quot; &#039;';
$str = htmlspecialchars($str, ENT_COMPAT, 'UTF-8', true);

// Ausgabe &amp;lt; &amp;gt; &amp;amp; &amp;quot; &amp;#039;
echo $str;


$str = '&lt; &gt; &amp; &quot; &#039;';
$str = htmlspecialchars($str, ENT_COMPAT, 'UTF-8', false);

// Ausgabe &lt; &gt; &amp; &quot; &#039;
echo $str;

?>

Die Funktion htmlspecialchars() wandelt nur die für HTML spezifischen Zeichen um. Um alle möglichen Zeichen in HTML-Entities umzuwandeln, kann man die Funktion htmlentities() verwenden. Wenn man alle HTML-Entities wieder in die zugehörigen Zeichen umwandeln möchte, kann man die Funktion html_entity_decode() nutzen. Mit htmlspecialchars_decode() werden dagegen nur Entities von den Zeichen umgewandelt, die in HTML eine besondere Bedeutung haben.