









En XML (et donc par voix de conséquence, en HTML) un attribut se définit comme suit :
nom=“valeur”
où le nom identifie l'attribut et la valeur son contenu. La valeur est toujours entre guillemets. Pour cette raison, il est impossible de stocker du contenu aillant un ou plusieurs guillemets.
exemple de code invalide :
echo '<input type="text" name="exemple" value="blah "blah" blah"/>'; //ou encore : $value='blah "blah" blah'; echo '<input type="text" name="exemple" value="'.$value.'"/>';
Ce type de code provoque typiquement un affichage totalement erroné.
Evidemment il existe une solution simple : ne pas mettre de guillemet !
Je vous vois déjà dire : Mais je ne peux pas faire autrement !
Rassurez vous, ne pas en mettre ne signifie pas “ne pas en avoir”.
L'HTML prévois un encodage particulier pour les caractères particuliers.
En cherchant on trouve que ” remplace ”. Une solution serait donc de remplacer tous les ” par ” exemple :
$value=str_replace('"',""",'blah "blah" blah'); echo '<input type="text" name="exemple" value="'.$value.'"/>';
Php propose d'ailleurs des fonctions capablent de remplacer tous les caractères spéciaux par leur équivalent HTML :
Mais il y a mieux.
Peu connu et peu utilisé, rawurlencode “retourne une chaîne dont tous les caractères non alphanumériques (hormis-_.) auront été remplacés par des séquences %xy (%), avec xy, deux valeurs hexadécimales.”
Ce qui signifie que :
$value=rawurlencode('blah "blah" blah'); echo $value;
affichera :
blah%20%22blah%22%20blah
Et ceci nous convient parfaitement ! Donc :
$value=rawurlencode('"',""",'blah "blah" blah'); echo '<input type="text" name="exemple" value="'.$value.'"/>';
fonctionne parfaitement.
Il est vrai que maintenant vous vous trouvez avec “blah%20%22blah%22%20blah” et c'est tous de même moins compréhensible. Pour revenir a votre chaîne originale, utiliser l'opposé de rawurlencode, à savoir : rawurldecode
$value="blah%20%22blah%22%20blah"; echo rawurldecode($value);
affichera :
blah “blah” blah
Discussion