2010-11-28 27 views
1
<?php echo ($i % 6 == 5) ? 'style=\"margin-right:0px\"' : ''; ?> 

Je viens d'imprimer style = "" sur le port d'affichage.Problème de concaténation de base de PHP?

Mise à jour: Pourquoi est-il inutile d'échapper les guillemets lorsque nous sommes dans une chaîne? Parce que les guillemets doubles ne seront jamais pris comme autre chose qu'une chaîne, s'ils se trouvent dans des guillemets simples?

Merci à l'avance, MEM

+0

Pouvons-nous voir un peu plus de votre code. Les antislashs n'ont pas d'importance. Vous devriez voir style = \ "margin-right: 0px \" not style = "" même avec les barres obliques. – typeoneerror

+0

comme vous avez par hasard style = "" – typeoneerror

+0

Où regardez-vous le résultat? Sortie brute? Navigateur? Inspecteur DOM du navigateur? – deceze

Répondre

3

Pourquoi est-il inutile d'échapper les guillemets lorsque nous sommes dans une chaîne? Parce que les guillemets doubles ne seront jamais pris comme autre chose qu'une chaîne, s'ils sont dans des guillemets simples?

Le manual, en ce qui concerne les chaînes entre guillemets simples:

Pour spécifier une seule citation littérale, l'évasion avec une barre oblique inverse (\). Pour spécifier une barre oblique inverse littérale, doublez-la (\\). Toutes les autres occurrences de barre oblique inverse seront traitées comme une barre oblique inverse littérale: cela signifie que les autres séquences d'échappement auxquelles vous pourriez être habitué, telles que \ r ou \ n, seront générées comme spécifié au lieu d'avoir une signification particulière.

+1

À droite, donc ça sort style = \ "margin-right: 0px \" not style = "", donc ce n'est pas son problème. – typeoneerror

+0

@Typeoneerror, oui, cela ne répond pas à sa première question [bien, en fait il n'y a pas de première question], mais seulement sa deuxième question, il a demandé à sa mise à jour. – Matthew

+2

S'il le regarde dans un navigateur (même via "view source"), je suspecte que l'analyseur xml/html du navigateur filtre et rejette la valeur d'attribut illégale dans 'style = \" margin-right: 0px \ "', ne laissant que 'style =" "'. – Lee

2

Vous avez utilisé les guillemets simples ' pour cette chaîne, donc échapper à des guillemets doubles " dans la chaîne est inutile. Remplacez cela par 'style="margin-right:0px"' et cela devrait fonctionner correctement.

Pour expliquer comment PHP gère les chaînes et les guillemets un peu mieux, il est utile de connaître la différence entre ' et ". Les chaînes encapsulées avec ' sont toujours représentées telles quelles. Rien à l'intérieur de la chaîne n'est analysé, y compris les caractères d'échappement (comme \n pour une nouvelle ligne ou des citations échappées, à l'exception des guillemets simples échappés \'). Inversement, les chaînes encapsulées dans " sont analysées, donc si vous avez des caractères d'échappement, elles seront affichées correctement, et si vous avez des variables dans la chaîne, elles seront également entrées. Par exemple,

// Set name variable to my name 
$name = "nhinkle"; 

// Echo hello name with single quotes 
echo 'hello {$name}'; 
// The result will be "hello {$name}" 

// Echo hello name with double quotes 
echo "hello {$name}"; 
// The result will be "hello nhinkle" 

Il prend moins de puissance de traitement à utiliser des guillemets simples, puisque PHP n'a pas besoin de scanner la chaîne pour échapper à quoi que ce soit, il a juste besoin de trouver la fin de la chaîne. Cependant, si vous avez besoin d'analyser des choses à l'intérieur de la chaîne, assurez-vous d'utiliser des guillemets doubles.

+0

@nhinkie - merci beaucoup. C'était une explication très claire qui me manquait depuis longtemps. À votre santé! ;) – MEM

2

Il n'est pas nécessaire d'échapper les guillemets doubles entre guillemets simples. Vous n'avez besoin d'échapper que des guillemets simples entre guillemets simples ou des guillemets entre guillemets. Si vous souhaitez écrire une seule citation dans une seule chaîne entre guillemets, cette citation unique mettrait fin à la chaîne.

$foo = 'a'b'; 

PHP voit que la chaîne a, suivie d'un b vide de sens et le début de la chaîne '; qui est jamais terminée; ce qui est une syntaxe invalide.

$foo = 'a\'b'; 

C'est correctement analysés comme la chaîne a'b. Vous avez échappé à la signification la citation aurait habituellement à ce stade.

Avec des guillemets doubles entre guillemets simples, il n'y a pas une telle ambiguïté. Une double citation dans une seule chaîne entre guillemets ne termine pas la chaîne, elle n'a pas de signification particulière qui aurait besoin d'être échappée. Si vous incluez un backslash, la barre oblique inverse est utilisée littéralement.

$foo = 'a"b'; // a"b 
$foo = 'a\"b'; // a\"b 

Je suppose que le problème est de savoir comment vous regardez la sortie. Si la sortie est style=\"…\", les guillemets doubles échappés peuvent entraîner une syntaxe non valide dans l'environnement dans lequel vous regardez la sortie.

+0

Justification de downvote, s'il vous plaît? – deceze

+0

Quelqu'un a également rejeté ma réponse quelque peu similaire. Pas certain de pourquoi. Après votre montage, j'ai l'impression que votre réponse est plutôt bonne. +1, donc au moins vous êtes encore maintenant. Les explications seraient bien. – nhinkle