Probleme Regex php, caractere bizarre

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Probleme Regex php, caractere bizarre

par cuak » 28 avr. 2008, 18:30

C bon, sujet resolu. Merci bcp

par Ryle » 28 avr. 2008, 14:51

C'est parce que tu travailles sur une chaine que tu as déclaré, tu ne devrais normalement pas avoir ce problème si tu lisais directement le fichier...

En gros, si dans ton fichier tu as la chaine tel quel :

Code : Tout sélectionner

" 10:05 ClientUserinfoChanged: 7 n\Terminator\t\3\r\2\tl\0\f0\\f1\\f2\\a0\255\a1\255\a2\255"
Pour la déclarer à php sous forme d'une chaine de caractères, il te faut protéger les caractères spéciaux (en l'occurence les "\") pour que php puisse l'interpréter correctement. Ta chaine devient alors :
" 10:05 ClientUserinfoChanged: 7 n\\Terminator\\t\\3\\r\\2\\tl\\0\\f0\\\\f1\\\\f2\\\\a0\\255\\a1\\255\\a2\\255"
(j'ai juste doublé les antislahes).
un echo de cette chaine t'affichera la chaine initiale.

Tes caractères bizares apparaissent parce que les antislash ne sont pas protégés. Il ne les considère donc pas comme le caractère "\" mais comme l'échappement du caractère qui suit et tente donc d'interpréter : \t = tabulation, \r = retour en début de ligne, \3 = un truc que je connais pas, mais qu'il va malgré tout essayer d'afficher, idem pour \f, etc. :)

par cuak » 28 avr. 2008, 13:01

ui c'est bcp plus clair. Mais sa ne regle pas mon probleme. En fait je vais le simplifier.
$data = " 10:05 ClientUserinfoChanged: 7 n\Terminator\t\3\r\2\tl\0\f0\\f1\\f2\\a0\255\a1\255\a2\255";
echo $data;
Pourquoi est ce que j'ai 1 caractere bizarre qui saffiche? Il y a t-il une fonction pour suprimer ce probleme de caractere speciaux?

par Ryle » 28 avr. 2008, 08:24

Il ne "faut" pas mettre 3 pour 1, il "peut parfois être nécessaire" d'en mettre 3, mais ca n'a rien d'une règle. La règle c'est "pour protéger un caractère spécial, on met un antislash devant" ;)

Donc pour protéger la chaine "\z" on écrit "\\z" ainsi l'antislash est protégé. En revanche pour protéger la chaine "\"" qui ne contient donc qu'une guillemet, on va protéger l'antislash ET la guillemet et on écrit "\\\"" auquel cas il en faut effectivement 3 :)

Sans oublier que \t, \r, \n, ... sont des caractères spéciaux (tabulation, retour en début de ligne, nouvelle ligne, ...) et donc "\t" correspond à une tabulation, "\\t" correspond à un antislash suivit d'un "t" et "\\\t" correspond à un antislash suivit d'une tabulation.

C'est y plus clair ? :)

par cuak » 27 avr. 2008, 15:09

ok alors je vais donner plus de precision. Il s'agit d'un jeu. Les log du jeu s'enregistre dans un fichier, et je souhaite parser le fichier en meme tps afin d'executer des commande php sur le jeu grace aux socket. Tous sa pour dire que je ne peut modifier mon message de base.

Le caractere apparait dès l'affichage du message de base.

Pour les antislahes, jai remarquer qu'il fallait en mettre 3 pour 1 donc sa ne me semble aps incorrect

par Ryle » 27 avr. 2008, 14:54

Et pourrais tu nous donner quelques précisions en plus ?
A quel moment ton caractères apparait ? dans $message ? dans $pseudo ? dans $team ?
C'est laquelle la regexp qui pose problème ?

Par ailleurs concernant les deux dernières, y a un peu beaucoup d'antislash à mon avis... surtout devant les parenthèse capturantes... Et peut être pas assez dans ta chaine d'origine : tu as un \r qui correspond à un retour en début de ligne, et qui normalement devrait être suivit d'un \n pour passer à la ligne suivante, sans quoi son comportement risque d'être assez aléatoire...

par cuak » 27 avr. 2008, 13:12

nn nn, je confirme c'est correct, Etant donner que je veut juste récupérer un pseudo et un chiffre.

par katagoto » 27 avr. 2008, 12:57

Tu as mal lu le tuto du SDZ :roll:
Bref je crois que $1 et $2 se sentent seul... met leur quelque choses
Si non il me semble que si tu rajoute un paramètre tu peux récupérer un tableau...

Probleme Regex php, caractere bizarre

par cuak » 27 avr. 2008, 12:47

Bonjour,

Je me retrouve face a un probleme que je n'arrive pas a résoudre, bien que je connaisse deja pas mal le php. Je ne savais plus quoi faire, donc je suis venu poster ici après mainte efforts.

Je tente de parser une ligne, connaissant le fonctionnement des regex, mais je bloc sur un caractère qui s'affiche mal.
$data = " 10:05 ClientUserinfoChanged: 7 n\Terminator\t\3\r\2\tl\0\f0\\f1\\f2\\a0\255\a1\255\a2\255";
if(preg_match('#[\d]+[:][\d]+[\s]+ClientUserinfoChanged:[\s]+(\d)+[\s]+(.*)#i', $data)) 
{
    $message = preg_replace('#[\d]+[:][\d]+[\s]+ClientUserinfoChanged:[\s]+(\d)+[\s]+(.*)#', '$2', $data);
    echo $message."<br>";
    $pseudo = preg_replace('#n(.+)\\\t\\\([0-9])\\\(.+)#', '$1', $message);
    $team = preg_replace('#n(.+)\\\t\\\([0-9])\\\(.+)#', '$2', $message);
    echo $pseudo."<br>".$team;
}
else
{
    echo"erreur";
}
je souhaite recuperer le pseudo et une valeur grace aux regex, mais sa ne marche pas. Jobtient une sorte de rectan,gle noir avec un point d'interrogation. Merci pour votre aide.