recherche d'un chevron dans une chaîne

lanusquet
Invité n'ayant pas de compte PHPfrance

21 oct. 2010, 18:02

Bonjour à tous.
Je galère depuis un bon bout de temps sur le pb suivant. Comment tester une chaîne alphanumérique pour savoir s'il y a un chevron dedans ? (ouvrant ou fermant, < ou >). Je sais le faire avec n'importe quelle occurrence, mais ça ne marche pas pour les chevrons, ni avec les expressions régulières, ni avec strpbrk(). Ni en échappant les chevrons avec \.
Quelqu'un peut m'expliquer pourquoi ? Cordialement, jml.

ViPHP
ViPHP | 5462 Messages

21 oct. 2010, 18:06

t'as fait quoi comme regexp ?

Invité
Invité n'ayant pas de compte PHPfrance

21 oct. 2010, 22:35

t'as fait quoi comme regexp ?
SI 'avais su, j'aurais attendu la réponse ! Je n'avais pas imaginé qu'elle arriverait si vite. Merci.
Voici les regexp essayées :
preg_match("#<#", $message)
preg_match("#\<#", $message)
preg_match("#'<'#", $message)
et tutti quanti !
Cordialement, jml.

ViPHP
ViPHP | 5462 Messages

21 oct. 2010, 23:45

la2eme est la bonne pour rajouter l'autre c'est
preg_match('/[\<\>]/', $message)

lanusquet
Invité n'ayant pas de compte PHPfrance

22 oct. 2010, 16:40

la2eme est la bonne pour rajouter l'autre c'est
preg_match('/[\<\>]/', $message)
Encore merci de cette réponse.
... mais non ! Le résultat est TRUE, même si un chevron est inclus dans $message ! C'est aussi le cas de ma 2e solution à moi, du reste. De toute évidence, le chevron ne se comporte pas là comme un caractère alpha-numérique.
Cordialement, jml.

lanusquet
Invité n'ayant pas de compte PHPfrance

22 oct. 2010, 19:36

la2eme est la bonne pour rajouter l'autre c'est
preg_match('/[\<\>]/', $message)
Encore merci de cette réponse.
... mais non ! Le résultat est TRUE, même si un chevron est inclus dans $message !


Hum ! j'ai dit une sottise. :oops: Le résultat doit être FALSE, j'imagine, puisque les conditions sur la regex sont passées sans arrêter le programme.

ViPHP
ViPHP | 5462 Messages

22 oct. 2010, 19:43

si y'a un chevron dedans ca sera égale a true, a toi de faire la condition que tu souhaite apres sachant que tu peux inverser un true/false

lanusquet
Invité n'ayant pas de compte PHPfrance

22 oct. 2010, 22:40

si y'a un chevron dedans ca sera égale a true, a toi de faire la condition que tu souhaite apres sachant que tu peux inverser un true/false
Je te remercie de toutes ces réponses. En fait, le test que tu m'a donné ne marche pas. Voici mon code :
<?php
$message = 'aeiou<abcd>aeiou';
$message = htmlspecialchars($message);
echo $message.'<p>';
if(
preg_match('/[\<\>]/', $message)
)
{echo 'le chevron y est';}
else
{echo 'le chevron n\'y est pas';}
?>
Quel que soit le contenu de $message, avec ou sans chevron, l'affichage est le même : "le chevron n'y est pas."

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

23 oct. 2010, 00:57

salut,

normal le problème vient du htmlspecialchars
comme le dit la doc
Description
string htmlspecialchars ( string $string [, int $flags = ENT_COMPAT [, string $charset [, bool $double_encode = true ]]] )

Certains caractères ont des significations spéciales en HTML, et doivent être remplacés par des entités HTML pour être affichés. htmlspecialchars() remplace tous ces caractères par leur équivalent dans la chaîne string. Cette conversion est très pratique pour la programmation web. Si vous devez remplacer tous les caractères, utilisez plutôt htmlentities() à la place.

htmlspecialchars() est pratique pour éviter que des données fournies par les utilisateurs contiennent des balises HTML, comme pour un forum ou un chat.

Les remplacements effectués sont :

"&" (et commercial) devient "&"
""" (guillemets doubles) devient """ lorsque ENT_NOQUOTES n'est pas utilisée.
"'" (guillemet simple) devient "'" uniquement lorsque ENT_QUOTES est utilisée.
"<" (inférieur à) devient "<"
">" (supérieur à) devient ">"
@+
Il en faut peu pour être heureux ......

lanusquet
Invité n'ayant pas de compte PHPfrance

23 oct. 2010, 01:07

[quote="moogli"]salut,

normal le problème vient du htmlspecialchars


YES !!!!!!!!!!!!!!!!!! et merci beaucoup !

Une dernière question, si ce n'est pas abuser...
Vaut-il mieux échapper les caractères html et conserver le message tel quel, OU BIEN tester les chevrons et refuser le message envoyé si on en trouve ? Autrement dit, est-ce que ce test des chevrons suffit à écarter toute tentative d'envoi malveillant (javascript, etc...) dans un formulaire ? Cordialement, jml.

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

23 oct. 2010, 01:28

salut,

htmlspecials car est fait pour cela, mais à utiliser à l'affichage seulement.

si tu utilise mysql pour le résultat de tes formulaires, utilise mysql_real_escape_string avant insertion.

tu peut ainsi éviter de refuser un message parce que l'on y a écrit 28<1 mais 28>34 ^^

@+
Il en faut peu pour être heureux ......

lanusquet
Invité n'ayant pas de compte PHPfrance

23 oct. 2010, 01:41

Merci encore à Moogli et à Stealh35 pour votre aide précieuse et votre disponibilité. Cordialement, jml.

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

23 oct. 2010, 01:44

de rien

@+
Il en faut peu pour être heureux ......