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

Petit nouveau ! | 5 Messages

11 août 2008, 14:24

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';
Modifié en dernier par Tchukai le 11 août 2008, 16:31, modifié 1 fois.

ViPHP
ViPHP | 4039 Messages

11 août 2008, 15:11

et en utilisant des doubles quotes plutôt ?
Mais qu'importe. (je suis ici - dernier petit projet)
Berze going social.

Petit nouveau ! | 5 Messages

11 août 2008, 16:16

En fait je ne cherche pas à éviter le comportement mais à le comprendre.

ViPHP
ViPHP | 1996 Messages

11 août 2008, 20:07

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.
It is nice to be important but it is more important to be nice
http://www.aureuswebfactory.fr

Petit nouveau ! | 5 Messages

12 août 2008, 08:59

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.

Petit nouveau ! | 5 Messages

12 août 2008, 15:15

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'; 

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

13 août 2008, 13:35

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
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Petit nouveau ! | 5 Messages

14 août 2008, 21:33

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