Probleme Regex php, caractere bizarre

Eléphant du PHP | 106 Messages

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.

Mammouth du PHP | 1668 Messages

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...
"À ceux qui poursuivent leurs rêves et se spécialisent dans l'impossible" Joseph Kong

10 ans de PHP, déjà.

"moi jtrouve que katagoto il déchire!" Nagol

Eléphant du PHP | 106 Messages

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.

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

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

Eléphant du PHP | 106 Messages

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

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

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

Eléphant du PHP | 106 Messages

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?

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

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

Eléphant du PHP | 106 Messages

28 avr. 2008, 18:30

C bon, sujet resolu. Merci bcp