8768 sujets

Développement web côté serveur, CMS

Bonjour tout le monde Smiley smile

Etant débutant en PHP j'espère que cette question ne vous paresse pas trop bète:

Comment donner en PHP une identité à un bloc de texte, afin de pouvoir l'utiliser à certains endroits en l'apellant par son nom?

En clair, je veux faire la même chose qu'avec un include ('...'); sauf que le texte à inclure se situe déja dans le document et non dans un fichier externe.

J'ai déja pensé aux variables mais celles-ci posent un problème quand le texte contient des guillemets. Ainsi ceci est impossible:
$texte = " un texte avec des "guillemets" ";


Avec define('...'); il se pose un problème analogue avec les apostrophes.

Bien sur on peut utiliser les backslash (\) pour résoudre le problème mais ceci devient rapidement fastidieux si le texte est long.

Y a-t-il un autre moyen?

Désolé si je vous ennuie avec une telle question mais je n'ai vraiment pas trouvé de réponse Smiley confused

Merci pour vos réponses,

Franz.
Modifié par Franz (09 Aug 2006 - 00:03)
Merci beaucoup.

Mais ce lien ne propose que l'utilisation de l'anti-slash que je voulais éviter.

Dois-je en conclure que ce que je veux faire est impossible?

Franz.
Salut

L'utilisation de l'antislash est effectivement la seule solution. Mais même dans le cas d'un texte relativement long, combien de fois les guillemets vont-ils revenir ? Pas si souvent que celà, si ?

Si c'est du texte récupéré d'un formulaire, tu peux utiliser la fonction addslashes() pour échapper les caractères spéciaux. Si c'est codé à la mimine, faut rajouter les backslash à la mimine aussi ...

Par ailleurs, je me demande à quoi cela va bien pouvoir te servir de définir une telle variable ? Tu dois répéter le même texte plusieurs fois sur une page ?
Modifié par Sopo (29 Jul 2006 - 12:11)
Comme indiqué dans le lien ci-dessus, tu peux utiliser des guillemets simples pour les chaînes PHP comportant elles-mêmes des guillemets doubles.
Modifié par Laurent Denis (29 Jul 2006 - 12:10)
Sopo a écrit :

L'utilisation de l'antislash est effectivement la seule solution.

Dommage...
Sopo a écrit :

Mais même dans le cas d'un texte relativement long, combien de fois les guillemets vont-ils revenir ? Pas si souvent que celà, si ?

C'est vrai. Peut-être le plus simple est de prendre l'habitude en rédigeant les textes de penser aux antislashs. Smiley decu
Sopo a écrit :

Par ailleurs, je me demande à quoi cela va bien pouvoir te servir de définir une telle variable ? Tu dois répéter le même texte plusieurs fois sur une page ?

Pas vraiment. En fait je suis en train de faire un site multi-langue. Sur chaque page de contenu .php le texte est présent en trois langues qui s'affichent ou non en fonction de la valeur de $_GET['lang']. Facile à faire avec switch. Mais il me faut aussi une langue par défaut et je n'ai pas envie de coier le texte dans cette langue 2 fois (ça serait assez bète de faire un copier/coller après chaque petite modification).
Et comme je n'ai pas envie d'attribuer un fichier à chaque langue, je vais devoir utiliser des variales avec des antislashs.
Laurent Denis a écrit :
Comme indiqué dans le lien ci-dessus, tu peux utiliser des guillemets simples pour les chaînes PHP comportant elles-mêmes des guillemets doubles.

Mais dans ce cas je suis alors privé d'apostrophes, non?
Des tests ont prouvés que l'utilisation en PHP de guillemets simples pour encadrer les chaines de caractères était plus optimisée que l'utilisation de guillemets. Tu devrais donc privilégier les guillemets simples, mais effectivement tu seras privé d'apostrophe.

Il n'y a pas 36 solutions :
- soit tu utilises un antislash devant chaque apostrophe ;
- soit tu convertis chaque apostrophe en son entité HTML correspondante (' je crois).
Modifié par 84mickael (29 Jul 2006 - 12:43)
84mickael a écrit :
Des tests ont prouvés que l'utilisation en PHP de guillemets simples pour encadrer les chaines de caractères était plus optimisée que l'utilisation de guillemets. Tu devrais donc privilégier les guillemets simples

Plus optimisée? Dans un sens technique (code PHP traité plus rapidement par le serveur) ou pratique?

Parceque à mon avis il est plus intélligent d'encadrer par des guillemets que l'on utilise bien moins souvent que des apostrophes.
Je ne sais pas si c'est ce dont tu as besoin, mais voici les fonctions que j'utilise pour traiter les chaines de caractères venant de formulaires saisis par l'utilisateur :
function code($txt)
{
	$txt = trim($txt);	
	$txt = htmlspecialchars($txt, ENT_QUOTES);
	$txt = purge_iso88591($txt);
	return $txt;
}

function purge_iso88591($txt)
{
	$cp1252 = array
	(
	   "\x80" => '€',	// EURO SIGN
	   "\x82" => '‚',	// SINGLE LOW-9 QUOTATION MARK
	   "\x83" => 'ƒ',	// LATIN SMALL LETTER F WITH HOOK
	   "\x84" => '„',	// DOUBLE LOW-9 QUOTATION MARK
	   "\x85" => '…',	// HORIZONTAL ELLIPSIS
	   "\x86" => '†',	// DAGGER
	   "\x87" => '‡',	// DOUBLE DAGGER
	   "\x88" => 'ˆ',	// MODIFIER LETTER CIRCUMFLEX ACCENT
	   "\x89" => '‰',	// PER MILLE SIGN
	   "\x8a" => 'Š',	// LATIN CAPITAL LETTER S WITH CARON
	   "\x8b" => '‹',	// SINGLE LEFT-POINTING ANGLE QUOTATION
	   "\x8c" => 'Œ',	// LATIN CAPITAL LIGATURE OE
	   "\x8e" => 'Ž',	// LATIN CAPITAL LETTER Z WITH CARON
	   "\x91" => '‘',	// LEFT SINGLE QUOTATION MARK
	   "\x92" => '’',	// RIGHT SINGLE QUOTATION MARK
	   "\x93" => '“',	// LEFT DOUBLE QUOTATION MARK
	   "\x94" => '”',	// RIGHT DOUBLE QUOTATION MARK
	   "\x95" => '•',	// BULLET
	   "\x96" => '–',	// EN DASH
	   "\x97" => '—',	// EM DASH
	   "\x98" => '˜',	// SMALL TILDE
	   "\x99" => '™',	// TRADE MARK SIGN
	   "\x9a" => 'š',	// LATIN SMALL LETTER S WITH CARON
	   "\x9b" => '›',	// SINGLE RIGHT-POINTING ANGLE QUOTATION
	   "\x9c" => 'œ',	// LATIN SMALL LIGATURE OE
	   "\x9e" => 'ž',	// LATIN SMALL LETTER Z WITH CARON
	   "\x9f" => 'Ÿ'	// LATIN CAPITAL LETTER Y WITH DIAERESIS
	);
	return strtr($txt, $cp1252);
}

- trim supprime les caractères invisibles en début et en fin de chaine ;
- htmlspecialchars convertit les caractéres spéciaux (', ", <, >, &) en entités HTML ;
- purge_iso88591 convertit les caractères invalides ISO-8859-1 en entités HTML.
Modifié par 84mickael (29 Jul 2006 - 13:10)
Franz a écrit :
Plus optimisée? Dans un sens technique (code PHP traité plus rapidement par le serveur) ou pratique?
C'est plus rapidement interprété côté serveur.

Apostrophes ou guillemets, lesquels choisir ?

Ca ne me gène pas car la plupart de mes données sont traitées comme indiqué ci dessus. Et puis je préfère ne pas trop mélanger HTML et PHP. Soit j'utilise les templates PHPLib soit je procède plutôt comme ça :
if(...)
{
   ?><p>Je m'appelle Mickaël.</p><?php
}
que comme ça :
if(...)
{
   echo '<p>Je m\'appelle Mickaël.</p>';
}
Le code HTML qui en résulte est plus agréable à lire car les sauts de ligne apparaissent.

De plus l'utilisation d'aspostrophes plutôt que de guillemets permet souvent d'éviter de faire la bêtise de mélanger chaines de caractères et variables. Mieux vaut écrire ça :
echo 'Toto a '.$nb.' maisons.';
ou ça :
echo 'Toto a ', $nb, ' maisons.';
que ça :
echo "Toto a $nb maisons";

Modifié par 84mickael (29 Jul 2006 - 13:19)
84mickael a écrit :
C'est plus rapidement interprété côté serveur.


Oui... mais non Smiley cligne

En effet : les guillemets simples (apostrophe si vous préférez) indiquent effectivement à PHP de considérer la chaîne comme statique (il n'y cherche pas de variables à traiter). Mais comme toute optimisation, celle-ci n'est pas un gain dans l'absolu. Elle n'aura d'utilité que relativement à l'ensemble des améliorations possibles dans le script. Or d'autres améliorations peuvent être nettement prioritaires.

En revanche, il est toujours bénéfique de privilégier la cohérence syntaxique et la lisibilité du code, quelque-soit la syntaxe qu'on adopte finalement. A ce niveau d'utilisation de PHP, on recommandera surtout de ne pas mélanger les différentes syntaxes...
Tu pourrais aussi utiliser ton switch avec un fichier externe. Par exemple :
// Dans la page web :
include('texte.php');

// dans le fichier texte.php :
<?php 
switch ($_GET['lang']) :
    case "fr" : ?>
    <p>Ceci est le texte en français, et en plus je peux mettre des " et des '</p><?php
    break;
    default : ?>
    <p>This is the english text, and you can even use " and ' if you like !</p><?php
    break;
endswitch;
?>


Edit : j'ai pas testé, code sans garantie, c'est juste une suggestion Smiley cligne

Re-edit : je préfère personnellement la solution du fichier externe dans la plupart des cas pour la facilité de mise à jour ... en conservant tout sur la même page, ça risque d'être moins lisible.
Modifié par Sopo (29 Jul 2006 - 13:20)
Laurent Denis a écrit :

Il me semble que c'est quand même une bonne habitude à prendre dès le départ.

Voici à ce sujet un tutoriel sur les différents optimisations possibles à PHP.

J'ai codé mon premier site (que je ne vous invite pas à visiter avant sa refonte !) n'importe comment (aussi bien le PHP que le HTML et le CSS), en apprenant sur le tas. Moi qui aie toujours été perfectionniste, si l'on m'avait parlé de tout ceci dès le départ, j'aurais peut-être passé plus de temps mais j'aurais gagné en efficacité.
Merci pour toutes ces réponses Smiley biggrin

Vous avez raison, il faut éviter de mélanger PHP et (X)HTML. Donc je vais laisser tomber mon idée avec les variables.

Mais le problème avec le code de Sopo est que chez moi un des trois "case" doit contenir exactement la même chose que "default" (une des trois langues est la langue par défaut).

Donc si je vois bien, j'ai trois possibilités:

- faire un copier/coller du "case" contenant la langue par défaut vers "default". Cela revient à avoir 2 fois le même texte dans le fichier *.php

- n'utiliser que "case" pour les deux langues qui ne sont pas par défaut. Dans ce cas la langue par défaut n'a pas de "case", ce qui ne pose techniquement aucun problème mais qui n'est pas très beau du point de vue de la logique.

- mettre chaque langue dans un fichier séparé et utiliser include dans le switch. Seul inconvénient (de mon point de vue): la rédaction se fait sur trois fichiers par page, ce que je ne trouve pas très beau.

Laquelle de ces possibilités me conseillez vous?
Logiquement, la deuxième ou la troisième. Mais pas la première. Si tu dois écrire plus de code pour obtenir le même résultat, prends la méthode qui demande le moins d'effort !

Ca c'est ce que j'appelle de la logique Smiley ravi
Modifié par Sopo (29 Jul 2006 - 21:14)
Voilà, j'ai décidé de prendre la troisième méthode, donc d'utiliser include. Ca marche très bien et finalement la rédaction sur trois pages n'est pas si gênante que ça Smiley smile

Il est tout de même bizarre que PHP ne propose pas quelque chose de ce genre:
$variable = { <html> ... </html> } ;

Mais bon, include est bien aussi.

Encore une fois merci à tous.

Franz.