2010-06-17 5 views
5

J'ai un peu de problème. J'essaye de créer un robot IRC, qui a une perluète dans son mot de passe. Cependant, j'ai du mal à mettre l'esperluette dans une chaîne. Par exemple ...PHP Ampersand in String

<?php 

$var = "g&abc123"; 

echo $var; 

?> 

Je crois que ce devrait imprimer g&abc123. Cependant, il imprime g.

J'ai essayé cela aussi:

<?php 
$arr = array("key" => "g&abc123"); 
print_r($arr); 
?> 

Cette impression est correcte avec le g&abc123, mais quand je dis echo $arr['key']; qu'il imprime à nouveau g. Toute aide serait appréciée. Je cours PHP5.3.1.

EDIT: De plus, je viens de remarquer que si je l'utilise g&abc123&abc123 il imprime g&abc123. Aucune suggestion?

+0

Où est-ce que cela est produit? –

+0

J'ai testé PHP 5.2.9 et ça marche très bien ... maintenant c'est bizarre. – websch01ar

Répondre

5

Je n'ai pas cette question dans une console:

php > $d="g&abc123"; 
php > echo $d; 
g&abc123 

Quel environnement sont vous imprimez la sortie à? Il semble que vous le visualisez dans un navigateur Web et que le & soit interprété comme une entité HTML mal formée. Essayez de remplacer le symbole & par l'entité codée version &amp;.

+0

Vous avez raison, j'imprime dans le navigateur. Cependant, il ne fait pas partie d'une balise HTML, d'un lien, etc. C'est juste le seul texte sur la page. En outre, j'ai essayé avec & et il a DID correctement. Malheureusement, c'est un problème parce que j'ai besoin d'envoyer les données à un serveur, et je ne sais pas si elles sont envoyées en tant que g & abc123 ou si elles sont envoyées en tant que g, et je ne peux pas envoyer g abc123. –

+1

Vous pouvez transformer automatiquement le texte en ce formulaire avec la fonction PHP htmlentities, et décoder avec html_entity_deocode - voir http://php.net/manual/fr/function.html-entity-decode.php Si vous l'envoyez quelque part, etc. vous pouvez être sûr que la valeur envoyée est la valeur indiquée par print_r. – JAL

+1

Vous avez raison. J'ai essayé cela dans Firefox et ça n'arrive pas. Cela semble être un problème de Chrome. Merci! –

5

Regardez le code source, il imprimera le bon code.

Si vous voulez imprimer correctement en HTML, puis exécutez htmlentities sur ou faire le & &amp;

+0

J'ai vérifié le code source, il dit seulement 'g'. –

+1

Puis quelque chose ne va pas avec votre serveur - Je viens de le tester (copié et collé votre code): http://www.phoenixdev.net/test-2.php –

+0

Pas de Kerry, dans Chrome, je reçois les mêmes résultats. ;) Ne se produit pas dans Firefox cependant. –

1

Affichez la source de la page Web pour vous assurer que votre variable contient la valeur correcte.

+0

Je l'ai fait il y a 18 minutes ... –

1

Vous envoyez probablement votre sortie à un navigateur Web.

La bonne façon de le faire est

En HTML, XHTML et XML, l'esperluette a une signification particulière. Il est utilisé pour les entités de caractères. Vous pouvez penser à cela comme une séquence d'échappement de toutes sortes.

Par exemple, en PHP, ce serait illégal:

$variable = 'It's Friday'; 

En effet, l'apostrophe est interprété par PHP comme la fin de votre chaîne, et le reste de votre contenu ressemble à ordures.

Au lieu de cela, vous devez dire:

$variable = 'It\'s Friday'; 

De même, en HTML et XHTML, vous ne pouvez pas dire

<h1>Inequalities</h1> 
<p> x<yz+3 </p> 

En effet, il serait interprété comme un élément.

Au lieu de cela, vous auriez à dire:

<h1>Inequalities</h1> 
<p> x&lt;yz+3 </p> 

Maintenant, comme vous pouvez le voir, l'esperluette lui-même a une signification particulière et, par conséquent, doit être échappé comme &. htmlspecialchars() le fera pour vous.

+0

Eh bien ... Je connais les exemples PHP ... Je sais aussi que & n'a pas de problème dans Firefox. Je comprends que dans XHTML (et probablement aussi HTML) & est la bonne façon de le faire. Mais je n'ai jamais eu un navigateur se mettre en colère parce que ce n'était pas fait de cette façon. Croyez-moi, si j'essayais de faire ce XHTML valide, ce serait un &, mais je l'utilisais juste à des fins de débogage. –

+0

Malheureusement, les navigateurs ont été conçus pour accepter à peu près tout ce que vous leur lancez, mais la façon dont il est géré est sujette à interprétation. L'équipe HTML5 essaye de créer un standard pour la manipulation de "tag soup" ... Personnellement, je ne suis pas très content de ça, mais que puis-je faire? Je vous recommande de créer un alias pour echo htmlspecialchars ($ text); Exemple: function h ($ text) {echo htmlspecialchars ($ text); } – MapDot