Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Conversion en entites html

3 réponses
Avatar
Pascal
Bonjour,

Voilà, j'utilise une architecture MVC* et les contenus HTML dynamiques
sont répartis dans des fichiers de template.
Comme ce ne sont pas des pages HTML complètes, il est difficile de les
éditer dans un WYSIWYG (genre Dreamweaver).
Et comme j'utilise un IDE pour le codage PHP, autant éditer le HTML dans
le même outil, mais en mode texte brut.

Ceci étant posé, je souhaite pouvoir écrire les contenus sans entités,
avec des caractères accentués et un encodage ISO-8859-15.
Je cherche donc une solution pour transformer, à la fin du traitement,
ces caractères en entités correspondantes, de préférence nommées.

Bien sûr, j'ai déjà plusieurs pistes, mais je voudrais les élargir avec
votre aide.

La première consiste à utiliser la fonction "htmlentities()", mais cela
suppose un retraitement inverse pour les chevrons, ce qui n'est pas si
simple car il peut y en avoir aussi dans le texte hors balises.

La deuxième consiste à établir une table de correspondance entre les
caractères à substituer et les entités équivalentes, puis à utiliser une
fonction comme "strtr()" pour effectuer la substitution.
C'est jouable mais un peu lourdingue, je trouve.

Dans tous les cas, je reste sensible à l'impact sur les performances, car
j'utilise un moteur de template ultra léger, c'est à dire ne nécessitant
pas de mise en cache serveur.

(* MVC = Modèle-Vue-Contrôleur)

--
Cordialement, Pascal.

3 réponses

Avatar
Olivier Miakinen
Le 05/11/2010 23:00, Pascal a écrit :

[...] je souhaite pouvoir écrire les contenus sans entités,
avec des caractères accentués et un encodage ISO-8859-15.
Je cherche donc une solution pour transformer, à la fin du traitement,
ces caractères en entités correspondantes, de préférence nommées.



Est-ce vraiment indispensable ? C'est parce que les fichiers de
template peuvent-être utilisés pour des pages finales ayant des
charsets différents d'une page à l'autre ? Si le charset final
est toujours UTF-8, par exemple, il suffit de faire une conversion
de charset sans passer par des entités.

Bien sûr, j'ai déjà plusieurs pistes, mais je voudrais les élargir avec
votre aide.

La première consiste à utiliser la fonction "htmlentities()", mais cela
suppose un retraitement inverse pour les chevrons, ce qui n'est pas si
simple car il peut y en avoir aussi dans le texte hors balises.



À priori pas des chevrons ouvrants, mais cela pourrait arriver pour les
chevrons fermants. Cela dit, ça ne pose pas de problème de les traduire
une fois dans un sens puis une fois dans l'autre... du coup, je ne vois
pas pourquoi « ce n'est pas si simple » (même si ça paraît quand même un
peu stupide).

La deuxième consiste à établir une table de correspondance entre les
caractères à substituer et les entités équivalentes, puis à utiliser une
fonction comme "strtr()" pour effectuer la substitution.
C'est jouable mais un peu lourdingue, je trouve.



Moins lourdingue que de faire un htmlentities() suivi d'une traduction
dans l'autre sens des chevrons...

D'ailleurs, pour te simplifier la tâche, tu dois pouvoir faire appel à
<http://fr2.php.net/manual/fr/function.get-html-translation-table.php>
(fonction que je découvre tout juste), puis supprimer de cette table les
traductions en trop, avant de faire le strtr().


Cordialement,
--
Olivier Miakinen
Avatar
Pascal
Pascal a écrit :

La première consiste à utiliser la fonction "htmlentities()", mais cela
suppose un retraitement inverse pour les chevrons, ce qui n'est pas si
simple car il peut y en avoir aussi dans le texte hors balises.



Me souvenais plus, mais on peut récupérer la table utilisée par
"htmlentities()", grâce à la fonction "get_html_translation_table()".
J'enlève les substitutions qui me gêne avec un "unset()" sur les éléments
correspondants du tableau et le tour est joué. Enfin, a priori.
Le code est en fin de billet.

Je reste quand même à l'écoute de suggestions, des fois que le pb ait
déjà été rencontré.
J'ouvre également un autre fil pour un pb lié, parce qu'éventuellement
traité dans le même code, mais différent par sa nature (anti-aspiration
d'e-mails).

<?php
function entityEncode($html, $level = 'soft', $mail = TRUE) {
$transTable = get_html_translation_table(HTML_ENTITIES, ENT_NOQUOTES);
if ($mail) {
$transTable['@'] = '&#64;';
}
switch ($level) {
case 'soft':
unset($transTable['&']);
case 'hard':
unset($transTable['<'],
$transTable['>']);
}
return strtr($html, $transTable);
}
?>

--
Cordialement, Pascal.
Avatar
Pascal
Olivier Miakinen a écrit :

D'ailleurs, pour te simplifier la tâche, tu dois pouvoir faire appel à
<http://fr2.php.net/manual/fr/function.get-html-translation-table.php>
(fonction que je découvre tout juste), puis supprimer de cette table les
traductions en trop, avant de faire le strtr().



Argh ! Toujours plus rapide que moi, Olivier !!!
C'est effectivement une des solutions que je viens aussi de voir (cf mon
auto-réponse).

Je regarderais demain à tête reposée tes autres commentaires.
Merci.

--
Cordialement, Pascal.