Page 1 sur 1

Curiosité à propos de addcslashes() et de \n

Posté : 11 août 2008, 14:24
par Tchukai
Bonjour
.............

Je me pose une question au sujet de la fonction addcslashes() et du caractère de retour à la ligne \n.
Pourquoi quand je code ceci :
echo 'blabla \n bla';
et que je regarde le code source à partir du navigateur, je constate que le \n fait son travail de passage à la ligne,
alors que quand je code ceci :
echo addcslashes('blabla n bla', 'n');
le passage à la ligne ne s'effectue pas (toujours dans le code source).
Il affiche la même chose que si je code ceci :
echo 'blabla \\n bla';

Posté : 11 août 2008, 15:11
par Berzemus
et en utilisant des doubles quotes plutôt ?

Posté : 11 août 2008, 16:16
par Tchukai
En fait je ne cherche pas à éviter le comportement mais à le comprendre.

Posté : 11 août 2008, 20:07
par Aureusms
Est ce que c'est lié ?

string addcslashes ( string $str , string $charlist )
charlist : Une liste de caractères à échapper. Si charlist contient les caractères \n, \r etc., ils seront convertis à la mode du langage C, alors que les autres caractères non-alphanumériques ayant un code ASCII inférieur à 26, et supérieur à 126 sont remplacés par leur représentation octale.
Toi tu utilises n et non \n.

Posté : 12 août 2008, 08:59
par Tchukai
echo ord('n');  110.
Si charlist contient les caractères \n, \r etc., ils seront convertis à la mode du langage C
A la mode C (C-like) je ne sait pas ce que c'est. Cependant, dans mon exemple il s'agit de la simple lettre 'n' et non du caractère '\n'. Le 'n' se situant selon ord() à un indice ascii (110) > 26 et < 126. Le cas que je soulève ne devrait pas être concerné par ce paragraphe de la doc.

Apparemment le comportement ne serait pas imputable à addcslashes.
$chrord = chr(ord('\\')).chr(ord('n'));

// Toujours en regardant le code source (Ctrl-u sous Firefox).
echo "Blabla \n bla"; // Passage à la ligne -> oui.
echo "Blabla $chrord bla"; // Passage à la ligne -> non.

Re: Curiosité à propos de addcslashes() et de \n

Posté : 12 août 2008, 15:15
par Tchukai
Bonjour
.............

Je me pose une question au sujet de la fonction addcslashes() et du caractère de retour à la ligne \n.
Pourquoi quand je code ceci :
echo 'blabla \n bla';
et que je regarde le code source à partir du navigateur, je constate que le \n fait son travail de passage à la ligne,
alors que quand je code ceci :
echo addcslashes('blabla n bla', 'n');
le passage à la ligne ne s'effectue pas (toujours dans le code source).
Il affiche la même chose que si je code ceci :
echo 'blabla \\n bla';


Edit : je me suis mélangé les pinceaux avec les guillemets doubles et simples, désolé.
La question peut peut-être se résumer à celle-ci :
pourquoi lorsqu'on affiche le code source dans le navigateur, on voit un passage à la ligne pour ce code :
echo "blabla \n bla"; 
et pas pour celui là :
echo 'blabla \n bla'; 

Posté : 13 août 2008, 13:35
par Ryle
Parce qu'entre apostrophes le retour à la ligne \n n'est pas interprété ?

C'est le même principe que pour les variables php dans une chaine : si tu utilises une variable entre guillemets, celle-ci est interprétée, pas entre apostrophes :
$var = "world";
echo "hello $var"; // affiche : hello world
echo 'hello $var'; // affiche : hello $var

Posté : 14 août 2008, 21:33
par Tchukai
D'accord d'accord.
Je vois que mon incompréhension du problème allait plus loin que je ne le pensais.
J'avais assimilé le \n comme quelque chose qui n'avait nullement besoin d'être interprété. Je pensais que lorsque le "visionneur" de code Firefox (Ctrl+u) rencontrait un \n, c'était à lui de l'interpréter comme une indication de passage à la ligne. D'où ma surprise de voir ce \n dans le code source.
En fait, si on veut que la destination voit un passage à la ligne, \n doit être interprété par PHP en une "entité" qui indique ce passage à la ligne.
Question subsidiaire alors, tant qu'à foutre, quelle "entité" est-ce exactement ? Un test répond à la question :
// Ici les " sont obligatoires donc pour que php interprète la chose comme "l'entité" de passage à la ligne.
ord("\n") // 10
Donc "l'entité" en question est un simple caractère. Comme je suis paranoïaque, je vérifie :
echo 'Blabla '. chr(10) .' bla'; // Affiche bien le passage à la ligne dans le code source et non un \n.
Ça marche, et du coup addcslashes() me parait plus utile maintenant que j'ai compris deux-trois trucs.
$aLaLigne = 'Blabla '. chr(10) .' bla';
$aLaLigne = addcslashes($aLaLigne, "\n"); // Converti le caractère de passage à la ligne en sont équivalent à interpréter -> \n :).
// Ici il n'y a plus de passage à la ligne dans le code source, mais un beau \n !
echo $aLaLigne; // (Ctrl+u) affiche bien -> Blabla \n bla