Discussion:
Representer entites en php
(trop ancien pour répondre)
Bernd
2007-05-05 19:30:53 UTC
Permalink
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
Olivier Miakinen
2007-05-05 19:55:02 UTC
Permalink
Post by Bernd
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
Post by Bernd
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.
Bernd
2007-05-05 20:27:50 UTC
Permalink
Post by Olivier Miakinen
Post by Bernd
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);
http://fr.php.net/manual/fr/function.htmlspecialchars.php
http://fr.php.net/manual/fr/function.htmlentities.php
Post by Bernd
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
Olivier Miakinen
2007-05-05 20:45:59 UTC
Permalink
Post by Bernd
Post by Olivier Miakinen
Post by Bernd
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.
Post by Bernd
Post by Olivier Miakinen
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.
Bernd
2007-05-06 09:55:26 UTC
Permalink
Post by Olivier Miakinen
Post by Bernd
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.
Post by 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.
On verra tout ça après le résultat des élections qui m'occupent bien ce
jour ;-)
--
A+

Romer
Olivier Miakinen
2007-05-06 13:30:31 UTC
Permalink
Post by Bernd
Post by 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.>
Post by Bernd
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.>
Bernd
2007-05-06 17:23:07 UTC
Permalink
Post by Olivier Miakinen
$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 />';
}
Post by Olivier Miakinen
<H.S.>
Post by Bernd
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
Olivier Miakinen
2007-05-07 09:31:28 UTC
Permalink
Post by Bernd
Post by Olivier Miakinen
$chaine_modifiee = str_replace('&', '&amp;', $chaine_initiale);
&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
Post by Bernd
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) ?
Post by Bernd
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";
Post by Bernd
[...] $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 ?)

:-(
Bernd
2007-05-07 21:06:11 UTC
Permalink
Post by Olivier Miakinen
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.
Post by Olivier Miakinen
Post by Bernd
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
' | apostrophe | &apos; | &#39;
& | ampersand | &amp; | &#38;

etc. et ceci pour 131 codes.
Post by Olivier Miakinen
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.
Post by Olivier Miakinen
$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);
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";
Post by Bernd
[...] $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
Olivier Miakinen
2007-05-10 10:27:49 UTC
Permalink
Post by Bernd
Post by Olivier Miakinen
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&pr=164>.
Post by Bernd
Post by Olivier Miakinen
Post by Bernd
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>.
Post by Bernd
- 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
Post by Bernd
Post by Olivier Miakinen
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é
Post by Bernd
Post by Olivier Miakinen
$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);
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.
Post by Bernd
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.
Post by Bernd
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. :-(
Continuer la lecture sur narkive:
Loading...