Funktion htmlentities() - Zeichen umwandeln in HTML-Entitäten

Auf Websites haben einige Sonderzeichen wie <, > oder & eine spezielle Bedeutung, sodass sie bei einer Verwendung als Text unter anderem als HTML-Entität geschrieben werden, z.B. &lt; für <. Bei der Verarbeitung von Zeichenketten können Sonderzeichen enthalten sein, die nicht als Entität vorliegen und in HTML-Entities umgewandelt werden müssen. Für solche Aufgaben kann man die Funktion htmlentities() verwenden. Diese wandelt alle Zeichen in entsprechende HTML-Codes um, sofern es hierfür HTML-Entities gibt. Innerhalb der runden Klammern kann man die folgenden Parameter angeben.

  1. Zeichenkette, auf die die Funktion angewendet werden soll (string).
  2. Berücksichtigung von flag-Konstanten, um z.B. Anführungszeichen nicht umzuwandeln (int, optional).
  3. Die Zeichenkodierung (encoding, optional).
  4. Berücksichtigung bereits vorhandener Entitäten (bool, optional).

Beim folgenden Code sind in der Variable die Zeichen Ä ä Ö ö Ü ü ß vorhanden. Nach der Umwandlung werden daraus:

  • &Auml; &auml; &Ouml; &ouml; &Uuml; &uuml; &szlig;

Der Effekt ist im Quelltext des Browsers sichtbar.

<?php

$str = 'Ä ä Ö ö Ü ü ß';

$str = htmlentities($str);

// Ausgabe &Auml; &auml; &Ouml; &ouml; &Uuml; &uuml; &szlig;
echo $str;

?>

flag-Konstanten

Als zweiten Parameter kann man sogenannte flag-Konstanten angeben. Damit wird z.B. festgelegt, wie einfache oder doppelte Anführungszeichen behandelt werden sollen. Es kann z.B. vorkommen, dass die Anführungszeichen nicht umgewandelt werden sollen. Die folgenden flag-Konstanten können angegeben werden.

  • ENT_QUOTES: Wandelt einfache und doppelte Anführungszeichen um.
  • ENT_NOQUOTES: Wandelt einfache und doppelte Anführungszeichen nicht um.
  • ENT_COMPAT: Wandelt doppelte Anführungszeichen um, einfache jedoch nicht (Standard).
  • ENT_IGNORE: Falls Code-Sequenzen ungültig sind, werden diese ignoriert, anstatt die Funktion einen leeren String zurückgeben zu lassen. Die Nutzung sollte vermieden werden, da es ein Sicherheitsrisiko darstellt.
  • ENT_SUBSTITUTE: Falls Zeichen-Codes ungültig für die Zeichenkodierung sind, werden diese 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 auf die Anführungszeichen getestet werden.

<?php

$str = '" " " \' \' \'';
$str = htmlentities($str);

// Ausgabe &quot; &quot; &quot; ' ' '
echo $str;


$str = '" " " \' \' \'';
$str = htmlentities($str, ENT_COMPAT);

// Ausgabe &quot; &quot; &quot; ' ' '
echo $str;


$str = '" " " \' \' \'';
$str = htmlentities($str, ENT_QUOTES);

// Ausgabe &quot; &quot; &quot; &#039; &#039; &#039;
echo $str;


$str = '" " " \' \' \'';
$str = htmlentities($str, ENT_NOQUOTES);

// Ausgabe " " " ' ' '
echo $str;

?>

Mit dem folgenden Code kann das Verhalten bei ungültigen Sequenzen (\x80 ungültig in UTF-8) getestet werden.

<?php

$str = "A B \x80 C D";
$str = htmlentities($str);

// Ausgabe
echo $str;


$str = "A B \x80 C D";
$str = htmlentities($str, ENT_IGNORE);

// Ausgabe A B  C D
echo $str;


$str = "A B \x80 C D";
$str = htmlentities($str, ENT_SUBSTITUTE);

// Ausgabe A B � C D
echo $str;

?>

Mehrere flag-Konstanten können mit einem | (Pipe) getrennt angegeben werden. Mit ENT_HTML401 wird der Code wie in der HTML-Version 4.01 behandelt. Das betrifft z.B. Zeichen, für die es in HTML 4.01 noch keine Entities gab oder die vom heutigen Standard abweichen. Beim folgenden Beispiel wird ein einfaches Anführungszeichen in &#039; umgewandelt.

<?php

$str = 'ä ö ü ß " \'';
$str = htmlentities($str, ENT_QUOTES | ENT_HTML401);

// Ausgabe &auml; &ouml; &uuml; &szlig; &quot; &#039;
echo $str;

?>

Mit ENT_XML1 werden die Umlaute ä, ö, ü und ß nicht umgewandelt. Ein einfaches Anführungszeichen wird nicht zu &#039; sondern zu &apos;. In HTML 4.01 gab es &apos; dagegen nicht.

<?php

$str = 'ä ö ü ß " \'';
$str = htmlentities($str, ENT_QUOTES | ENT_XML1);

// Ausgabe ä ö ü ß &quot; &apos;
echo $str;

?>

Mit ENT_XHTML werden Umlaute und Anführungszeichen umgewandelt. Ein einfaches Anführungszeichen wird zu &#039;.

<?php

$str = 'ä ö ü ß " \'';
$str = htmlentities($str, ENT_QUOTES | ENT_XHTML);

// Ausgabe &auml; &ouml; &uuml; &szlig; &quot; &#039;
echo $str;

?>

Mit ENT_HTML5 werden Umlaute und Anführungszeichen umgewandelt. Das einfache Anführungszeichen wird zu &apos;.

<?php

$str = 'ä ö ü ß " \'';
$str = htmlentities($str, ENT_QUOTES | ENT_HTML5);

// Ausgabe &auml; &ouml; &uuml; &szlig; &quot; &apos;
echo $str;

?>

Zeichenkodierung

Als dritter Parameter kann die Zeichenkodierung angegeben werden. Falls der Parameter ausgelassen wird, gilt der Standardwert, der abhängig von der PHP-Version ist. Vor PHP 5.4 ist das ISO-8859-1 gewesen und bei den nachfolgenden Versionen UTF-8. Ab PHP 5.6 gilt als Standard der Wert, der in der php.ini unter default_charset eingetragen ist. Für eine größtmögliche Portabilität sollte der Parameter nicht ausgelassen werden. Da der PHP-Interpreter als zweiten Parameter die flag-Konstanten erwartet, kann man an der Stelle ENT_COMPAT angeben, was dem Standard entspricht.

<?php

$str = '" " " \' \' \'';
$str = htmlentities($str, ENT_COMPAT, 'UTF-8');

// Ausgabe &quot; &quot; &quot; ' ' '
echo $str;

?>

Behandlung bereits vorhandener HTML-Entities

Eine Zeichenkette kann bereits HTML-Entities enthalten. Da mit der Funktion z.B. das Zeichen & umgewandelt wird, das auch ein Teil von Entities sein kann, kann das dazu führen, dass die vorhandenen Entities nicht mehr gültig sind. Man kann den 4. Parameter auf false setzen und so die Umwandlung bereits vorhandener Entities verhindern. Die Standardeinstellung ist true.

<?php

$str = '&amp;';
$str = htmlentities($str, ENT_COMPAT, 'UTF-8', true);

// Ausgabe &amp;amp;
echo $str;


$str = '&amp;';
$str = htmlentities($str, ENT_COMPAT, 'UTF-8', false);

// Ausgabe &amp;
echo $str;

?>

Die Funktion htmlentities() wandelt alle geeigneten Zeichen in Entities um und es gibt nur einige Möglichkeiten für eine Feinsteuerung. Es sollte daher mit Vorsicht eingesetzt werden. Eine alternative könnte htmlspecialchars() sein, mit der lediglich die Zeichen umgewandelt werden, die in HTML eine spezielle Bedeutung haben.