2004-01-05

Caractères spéciaux et formulaires (X)HTML

Voici un petit bout de code pour les programmeurs en PHP. Vous avez peut-être mis en place un formulaire sur votre site Web afin que vos visiteurs puissent écrire et envoyer des messages. Cela peut être des commentaires d'un weblog, un forum, une fiche d'inscription... Ces informations apparaitront ensuite sur votre site, affichées dans un document (x)html.

Certains caractères peuvent poser des problèmes à l'affichage, voire provoquer des erreurs quand le document est en XML. Ces caractères sont : l'esperluette « & », les symboles inférieur « < » et supérieur « > », ainsi que certaines combinaisons de guillemets anglais et d'apostrophes. Pour pouvoir afficher quand même ces caractères, on doit, dans le document, les écrire sous forme d'entité ou sous forme de référence numérique. Par exemple, écrire &amp; ou &#38; pour afficher une esperluette.

Lors du traitement d'un message envoyé à l'aide d'un formulaire, il convient alors de convertir tous ces caractères spéciaux sous la forme d'entités ou de références numériques. Pour cela, il existe une fonction en PHP nommée « htmlspecialchars ». Cette fonction est bien pratique, cependant elle a un défaut : elle ne prend pas en compte les références numériques susceptibles de se trouver dans le texte reçu.

Comme je le mentionnais dans un précédent billet, les navigateurs modernes envoient une mixture de caractères codés normalement, et de caractères codés sous la forme de références numériques. Il est donc intéressant d'avoir une fonction qui remplace les caractères spéciaux, mais sans toucher aux références numériques. C'est ce que fait ma fonction, que j'ai appelée « xhtmlspecialchars ». Le prototype est le même que pour « htmlspecialchars ».

J'ai créé une page d'exemple pour illustrer cette fonction. Vous pouvez aussi accéder au code source. N'oubliez pas de récupérer la fonction « xhtmlspecialchars_callback » qui va avec la fonction principale « xhtmlspecialchars ».

À noter que si votre document utilise un format d'encodage basé sur Unicode (UTF-8, UTF-16 etc.) vous devriez pouvoir vous passer des références numériques, et donc de ce bout de code. En revanche, si votre site utilise de l'iso-8859-* ou du windows-1252, servez-vous :)