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

Representer entites en php

9 réponses
Avatar
romer
Hi,

Je me suis fait un petit aide-mémoire qui donne le code des principaux
caractère unicode européens. Ces entités sont stockés dans une table
mysql que je récupère grâce à des lignes php.

Mais les entités ne se représentent pas comme je le souhaite :

Ex:

Dans la base mysql j'ai écris les codes de l'ampersand & : &amp et &#38
Mais dès que je veux visualiser sur le web ces codes via php, ils se
transforment en & alors que je souhaite évidemment que s'écrivent &amp
et &#38.

Quelle transformation opérer pour avoir cela ?

La ligne php qui les liste dans un tableau html est une boucle dans
laquelle se trouve :

while($data = mysql_fetch_assoc($req))
{
echo '<tr>
<th>'.$data['symbole'].'<td>'.$data['sens'].'<td>'.$data['nom'].'<td>'.$
data['code'].'<br />';

J'espère avoir été clair - Par avance merci.

--
A+

Romer

9 réponses

Avatar
Olivier Miakinen

Dans la base mysql j'ai écris les codes de l'ampersand & : &amp et &#38
Mais dès que je veux visualiser sur le web ces codes via php, ils se
transforment en & alors que je souhaite évidemment que s'écrivent &amp
et &#38.

Quelle transformation opérer pour avoir cela ?


http://fr.php.net/manual/fr/function.str-replace.php
str_replace('&', '&amp;', $chaine);

Mais voir aussi :
http://fr.php.net/manual/fr/function.htmlspecialchars.php
http://fr.php.net/manual/fr/function.htmlentities.php

J'espère avoir été clair - Par avance merci.


Il me semble. Si ma réponse est tombée à côté, c'est que ce ne l'était
pas et tu devras alors préciser ton besoin.

Avatar
romer
Olivier Miakinen <om+ wrote:

Dans la base mysql j'ai écris les codes de l'ampersand & : &amp et &#38
Mais dès que je veux visualiser sur le web ces codes via php, ils se
transforment en & alors que je souhaite évidemment que s'écrivent &amp
et &#38.

Quelle transformation opérer pour avoir cela ?


http://fr.php.net/manual/fr/function.str-replace.php
str_replace('&', '&amp;', $chaine);

Mais voir aussi :
http://fr.php.net/manual/fr/function.htmlspecialchars.php
http://fr.php.net/manual/fr/function.htmlentities.php

J'espère avoir été clair - Par avance merci.


Il me semble. Si ma réponse est tombée à côté, c'est que ce ne l'était
pas et tu devras alors préciser ton besoin.


Merci de tes liens - la 1re utilisation sans consulter les URL de la
fonction str_replace n'a rien donné mais je consulte les liens pour en
savoir plus.
--
A+

Romer


Avatar
Olivier Miakinen

Dans la base mysql j'ai écris les codes de l'ampersand & : &amp et &#38




Tiens, je n'avais pas fait gaffe à la première lecture. Attention, ce
n'est pas « &amp » ni « &#38 » mais « &amp; » et « &#38; » ! N'oublie
jamais le point-virgule car sinon le comportement peut varier d'un
navigateur à l'autre.

http://fr.php.net/manual/fr/function.str-replace.php
str_replace('&', '&amp;', $chaine);


Merci de tes liens - la 1re utilisation sans consulter les URL de la
fonction str_replace n'a rien donné mais je consulte les liens pour en
savoir plus.


En consultant le lien tu aurais peut-être constaté que la transformation
ne se fait pas « sur place » avec un paramètre passé par référence, mais
qu'il faut la récupérer en retour de la fonction.



Avatar
romer
Olivier Miakinen <om+ wrote:

Dans la base mysql j'ai écris les codes de l'ampersand & : &amp et &#38




Tiens, je n'avais pas fait gaffe à la première lecture. Attention, ce
n'est pas « &amp » ni « &#38 » mais « &amp; » et « &#38; » ! N'oublie
jamais le point-virgule car sinon le comportement peut varier d'un
navigateur à l'autre.


En effet - je l'ai oublié dans le post mais ils se trouvent bien dans la
page php.

En consultant le lien tu aurais peut-être constaté que la transformation
ne se fait pas « sur place » avec un paramètre passé par référence, mais
qu'il faut la récupérer en retour de la fonction.


Là je ne pige pas très bien mais la consultation des différents liens
devraient éclairer la question.
On verra tout ça après le résultat des élections qui m'occupent bien ce
jour ;-)

--
A+

Romer




Avatar
Olivier Miakinen

En consultant le lien tu aurais peut-être constaté que la transformation
ne se fait pas « sur place » avec un paramètre passé par référence, mais
qu'il faut la récupérer en retour de la fonction.


Là je ne pige pas très bien mais la consultation des différents liens
devraient éclairer la question.


Pour mettre les points sur les i :
$chaine_modifiee = str_replace('&', '&amp;', $chaine_initiale);

<H.S.>

On verra tout ça après le résultat des élections qui m'occupent bien ce
jour ;-)


Pour le moment, c'est le résultat d'une seule élection qui me préoccupe
(l'élection présidentielle). Pour les législatives il sera temps de s'en
inquiéter plus tard.

</H.S.>


Avatar
romer
Olivier Miakinen <om+ wrote:

Pour mettre les points sur les i :
$chaine_modifiee = str_replace('&', '&amp;', $chaine_initiale);


J'ai écrit dans une table mysql les différents codes : par ex. pour ¤ :
&euro et &#8364 de façon à avoir tous ces codes rapidement sous la main
en cas de besoin.

Sur le web, l'appel à cette table se fait en php avec entre autres la
boucle suivante :

// boucle
while($data = mysql_fetch_assoc($req))
{
echo '<tr>
<th>'.$data['symbole'].'<td>'.$data['sens'].'<td>'.$data['nom'].'<td>'.$
data['code'].'<br />';
}

Et j'obtiens ¤ à la place des 2 codes ci-dessus. Ce qui évidemment va à
l'encontre de ce que je veux obtenir.

C'est là le petit mystère : où dois-je utiliser ce str_replace.

J'ai fait ce qui suit et ça ne marche pas :

echo '<tr>
<th>'.$data['symbole'].'<td>'.$data['sens'].'<td>'.$data[str_replace('no
m')].'<td>'.$data[str_replace('code')].'<br />';
}

<H.S.>

On verra tout ça après le résultat des élections qui m'occupent bien ce
jour ;-)


Pour le moment, c'est le résultat d'une seule élection qui me préoccupe
(l'élection présidentielle). Pour les législatives il sera temps de s'en
inquiéter plus tard.

</H.S.>


Un site de presse belge donne (sous toute réserve évidemment) déjà les
résultats... wait and see.
--
A+

Romer


Avatar
Olivier Miakinen

Pour mettre les points sur les i :
$chaine_modifiee = str_replace('&', '&amp;', $chaine_initiale);


J'ai écrit dans une table mysql les différents codes : par ex. pour ¤ :
&euro et &#8364


Non : « &euro; » à la place de « &euro » ; et « &#8364; » au lieu de
« &#8364 » !

À la limite, stocke juste « euro » et « 8364 », ça t'évitera ces
problèmes d'affichage. :-p

echo '<tr>
<th>'.$data['symbole'].'<td>'.$data['sens'].'<td>'.$data['nom'].'<td>'.$
data['code'].'<br />';


C'est bizarre : pourquoi as-tu besoin d'un saut de ligne dans la
dernière case, celle qui contient $data['code'] ?

Encore plus bizarre : comment peux-tu avoir des balises non fermées
(donc du vrai HTML) et en même temps un « <br /> » (donc du XHTML) ?

Et j'obtiens ¤ à la place des 2 codes ci-dessus. Ce qui évidemment va à
l'encontre de ce que je veux obtenir.

C'est là le petit mystère : où dois-je utiliser ce str_replace.


Le plus simple :
$resultat = "<tr>n";
$resultat .= "<th>$data[symbole]</th>n";
$resultat .= "<td>$data[sens]</td>n";
$resultat .= "<td>$data[nom]</td>n";
$resultat .= "<td>$data[code]</td>n";
$resultat .= "</tr>n";
echo str_replace('&', '&amp;', $resultat);

Mais tu peux préférer :
echo "<tr>n";
echo "<th>$data[symbole]</th>n";
echo "<td>$data[sens]</td>n";
echo "<td>" . str_replace('&', '&amp;', $data['nom']) . "</td>n";
echo "<td>" . str_replace('&', '&amp;', $data['code']) . "</td>n";
echo "</tr>n";

J'ai fait ce qui suit et ça ne marche pas :

[...] $data[str_replace('code')] [...]


Je veux bien croire que tu sois désespéré par le résultat de l'élection,
mais là on dirait que tu trolles. Tu es censé vouloir remplacer les '&'
(où as-tu écrit '&' dans ton script ?) par des '&amp;' (où as-tu écrit
'&amp;' dans ton script ?) dans une chaîne qui contient des '&' (où y
a-t-il des '&' dans la chaîne 'code' ?) et la fonction str_replace()
prend au moins trois paramètres (combien as-tu mis de paramètres dans
tes appels ?)

:-(


Avatar
romer
Olivier Miakinen <om+ wrote:

Non : « &euro; » à la place de « &euro » ; et « &#8364; » au lieu de
« &#8364 » !


En effet - mais ce n'est pas cela qui coince. C'est qu'à la place de
&#8364, j'obtiens ¤. Donc celui qui lit cela n'est pas très avancé quand
il cherche le code de l'euro.

echo '<tr>
<th>'.$data['symbole'].'<td>'.$data['sens'].'<td>'.$data['nom'].'<td>'.$
data['code'].'<br />';


C'est bizarre : pourquoi as-tu besoin d'un saut de ligne dans la
dernière case, celle qui contient $data['code'] ?


Pour aller à la ligne - je souhaite avoir cela dans un tableau de 4
colonnes sur le web.

caractère | définition | nom | code
| greater-than | &gt; | &#62;
' | apostrophe | &apos; | &#39;

& | ampersand | &amp; | &#38;

etc. et ceci pour 131 codes.

Encore plus bizarre : comment peux-tu avoir des balises non fermées
(donc du vrai HTML) et en même temps un « <br /> » (donc du XHTML) ?


Exact - j'ai fait là une exeption à la fermeture des balises car sinon
la ligne n'en finit plus et j'ai du mal à m'y retrouver si une erreur
survient. J'économise la moitié des tags (je précise que c'est la 1re
fois que je le fais cela pour clarté - j'en suis à la phase de mise au
point. Si ça marche, je ferme les balises.

Le plus simple :
$resultat = "<tr>n";
$resultat .= "<th>$data[symbole]</th>n";
$resultat .= "<td>$data[sens]</td>n";
$resultat .= "<td>$data[nom]</td>n";
$resultat .= "<td>$data[code]</td>n";
$resultat .= "</tr>n";
echo str_replace('&', '&amp;', $resultat);

Mais tu peux préférer :
echo "<tr>n";
echo "<th>$data[symbole]</th>n";
echo "<td>$data[sens]</td>n";
echo "<td>" . str_replace('&', '&amp;', $data['nom']) . "</td>n";
echo "<td>" . str_replace('&', '&amp;', $data['code']) . "</td>n";
echo "</tr>n";

J'ai fait ce qui suit et ça ne marche pas :

[...] $data[str_replace('code')] [...]


Je veux bien croire que tu sois désespéré par le résultat de l'élection,
mais là on dirait que tu trolles. Tu es censé vouloir remplacer les '&'
(où as-tu écrit '&' dans ton script ?) par des '&amp;' (où as-tu écrit
'&amp;' dans ton script ?) dans une chaîne qui contient des '&' (où y
a-t-il des '&' dans la chaîne 'code' ?) et la fonction str_replace()
prend au moins trois paramètres (combien as-tu mis de paramètres dans
tes appels ?)

:-(


Je me suis hyper mal expliqué - j'ai fait une table mysql qui représente
les codes et les noms des principaux caractères du clavier - surtout les
exotiques comme le yen, etc. C'est pour les avoir vite sous la main en
cas de besoin.
Donc la table contient cela :
& | ampersand | &amp; | &#38;

(les "|" sont les bordures des colonnes du tableau)

Pour récupérer cette ligne sur le web, je vais récupérer ces 4 valeurs
de la 1re ligne du tableau par le code php ci-dessus.

Le hic est que sur le web, j'obtiens :

& - ampersand - & - & (ce qui n'avance pas beaucoup les choses ;-)

D'où ma question : comment échapper ces caractères pour avoir &amp; -
&#38; à l'écran ?

Merci de t'être penché sur ce cas un peu retors.

--
A+

Romer


Avatar
Olivier Miakinen
Olivier Miakinen <om+ wrote:

Non : « &euro; » à la place de « &euro » ; et « &#8364; » au lieu de
« &#8364 » !


En effet - mais ce n'est pas cela qui coince. C'est qu'à la place de
&#8364, j'obtiens ¤. Donc celui qui lit cela n'est pas très avancé quand
il cherche le code de l'euro.


Pfff... Alors envoie-le sur :
<http://www.miakinen.net/vrac/charsets/?hv=h&o6=MacRoman&or=3&pr4>.

echo '<tr>
<th>'.$data['symbole'].'<td>'.$data['sens'].'<td>'.$data['nom'].'<td>'.$
data['code'].'<br />';


C'est bizarre : pourquoi as-tu besoin d'un saut de ligne dans la
dernière case, celle qui contient $data['code'] ?


Pour aller à la ligne


Mais bon sang, pourquoi aller à la ligne *dans* la quatrième case ?
Parce que, si tu n'es pas au courant, l'élément BR ne ferme pas
l'élément TD.

Quant à passer à la ligne suivante du tableau, cela se fait bien sûr
en changeant de <tr>.

- je souhaite avoir cela dans un tableau de 4
colonnes sur le web.


http://www.w3.org/TR/html401/struct/tables.html
http://www.la-grange.net/w3c/html4.01/struct/tables.html

Encore plus bizarre : comment peux-tu avoir des balises non fermées
(donc du vrai HTML) et en même temps un « <br /> » (donc du XHTML) ?


Exact - j'ai fait là une exeption à la fermeture des balises car sinon
la ligne n'en finit plus et j'ai du mal à m'y retrouver si une erreur
survient.


Si tu ne fermes pas une balise en XML, la probabilité d'une erreur est
de 100 %. Quant à faire un code PHP lisible *et* et un code généré
lisible, tu ne sembles pas avoir lu mes propositions :

Le plus simple :
$resultat = "<tr>n";
$resultat .= "<th>$data[symbole]</th>n";
$resultat .= "<td>$data[sens]</td>n";
$resultat .= "<td>$data[nom]</td>n";
$resultat .= "<td>$data[code]</td>n";
$resultat .= "</tr>n";
echo str_replace('&', '&amp;', $resultat);

Mais tu peux préférer :
echo "<tr>n";
echo "<th>$data[symbole]</th>n";
echo "<td>$data[sens]</td>n";
echo "<td>" . str_replace('&', '&amp;', $data['nom']) . "</td>n";
echo "<td>" . str_replace('&', '&amp;', $data['code']) . "</td>n";
echo "</tr>n";



Si tu ne le savais pas encore, sache que les sauts de ligne prévus
ci-dessus ne changent rien à l'interprétation, que ce soit en HTML ou
en XHTML. Tu peux même rajouter des tabulations aux débuts des lignes.
Et bien sûr, ceci devrait résoudre ton problème en même temps.

Je me suis hyper mal expliqué - j'ai fait une table mysql qui représente
[ nouvelle explication de ce que tu as, de ce que tu as fait, de ce que
tu obtiens et de ce que tu voudrais obtenir ]
D'où ma question : comment échapper ces caractères pour avoir &amp; -
&#38; à l'écran ?


J'ai déjà répondu à tout ça, et je t'ai même donné le code PHP à
copi-coller pour que ça marche. Si tu ne veux pas le lire, je ne peux
plus rien faire pour toi.

Merci de t'être penché sur ce cas un peu retors.


Si je peux me permettre, c'est toi qui me sembles un peu retors ici. :-(