IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Détection d'anti-slash [RegEx]


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    183
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 183
    Par défaut Détection d'anti-slash
    Je souhaite traiter des chemins de fichiers.. j'ai trouvé un comportement qui me semble anormal dès qu'il y a certains chiffres après. Qui peut m'expliquer ou se trouve mon erreur dans mon tout petit motif de détection d'antislash ('[\\\]') ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    	//$str_chaine_avec_antislash="abcde\fghij.php"; // renvoi "found"
    	//$str_chaine_avec_antislash="abcde\ fghij.php"; // renvoi "found"
    	//$str_chaine_avec_antislash="abcde\0fghij.php"; // renvoi "NOT found"
    	//$str_chaine_avec_antislash="abcde\1fghij.php"; // renvoi "NOT found"
    	//$str_chaine_avec_antislash="abcde\2fghij.php"; // renvoi "NOT found"
    	//$str_chaine_avec_antislash="abcde\3fghij.php"; // renvoi "NOT found"
    	//$str_chaine_avec_antislash="abcde\4fghij.php"; // renvoi "NOT found"
    	//$str_chaine_avec_antislash="abcde\5fghij.php"; // renvoi "NOT found"
    	//$str_chaine_avec_antislash="abcde\6fghij.php"; // renvoi "NOT found"
    	//$str_chaine_avec_antislash="abcde\7fghij.php"; // renvoi "NOT found"
    	//$str_chaine_avec_antislash="abcde\8fghij.php"; // renvoi "found"
    	//$str_chaine_avec_antislash="abcde\9fghij.php"; // renvoi "found"
    	//--- tester si présence d'un antislash dans la chaine
    	if(preg_match('[\\\]',$str_chaine_avec_antislash)==1) echo "\n found \n";
    	else echo "\n NOT found \n";
    Merci aux posteurs éclairés et bienveillants qui pourront m'aider.

  2. #2
    Membre chevronné
    Inscrit en
    Septembre 2006
    Messages
    685
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 685
    Par défaut
    Je suppose que c'est parce qu'un antislash suivit d'un nombre désigne une référence arrière.

    En utilisant preg_quote() sur la chaine à analyser le problème est règlé.

  3. #3
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    183
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 183
    Par défaut
    Merci Xunil, ça marche... presque :

    si j'essaye avec une chaine sans le point :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	$str_chaine_avec_antislash="abcde\2fghijphp"; // renvoi "not found"
    il ne trouve pas mon antislash...

    ... en + continuant mon code, j'ai trouvé des effets bizzares (pour la première fois j'ai un code qui me nargue littéralement en m'envoyant un smiley - voir les post suivant)

  4. #4
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    183
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 183
    Par défaut
    Maintenant je veux remplacer l'antislash par un point... ça devrait être facile...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    	//$str_chaine_avec_antislash="abcde\fghij.php"; // renvoi "found"
    	//$str_chaine_avec_antislash="abcde\ fghij.php"; // renvoi "found"
    	$str_chaine_avec_antislash="abcde\2fghij.php"; // renvoi "found"
    	//--- tester si présence d'un antislash dans la chaine
    	find_and_replace_antislash($str_chaine_avec_antislash);
     
    	function find_and_replace_antislash($str_to_detect)
    	{
    	if(preg_match('[\\\]',preg_quote($str_to_detect))==1) echo "\n found \n";
    	else echo "\n NOT found \n";
    	echo preg_replace('[\\\]',".",preg_quote($str_to_detect));
    	}
    facile ?... Résultat pour le code au-dessus :

    found
    abcdefghij..php // j'ai mis un smiley, car sous dos ça me donne vraiment ça (mais en version monochrome)

    Résumé de mes galères : preg_match trouve bien mon antislash.. mais :
    • preg_quote me double les points
    • preg_replace m'a transformé mon antislash en "" (c'est joli mais bon..)

  5. #5
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    183
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 183
    Par défaut
    En fait, il semble que :

    preg_match('[\\\]',preg_quote($str_to_detect));

    ne soit pas équivalent en terme de détection que

    preg_replace('[\\\]',......,preg_quote($str_to_detect));

    puisque ce dernier parvient pas a remplacer l'antislash détecté pourtant par le précedent preg_match...

    SAUF que si j'active les options de preg_replace pour lire le nombre de remplacement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    	$str_chaine_avec_antislash="abcde\2fghij.php"; // renvoi "found"
    	//--- tester si présence d'un antislash dans la chaine
    	find_and_replace_antislash($str_chaine_avec_antislash);
    	//'[\\\]'
    	function find_and_replace_antislash($str_to_detect)
    	{
    	if(preg_match('[\\\]',preg_quote($str_to_detect))==1) echo "\n found \n";
    	else echo "\n NOT found \n";
    	echo preg_replace('[\\\]',".",preg_quote($str_to_detect),-1,$nb_remplacement);
    	echo " \n nb de remplacement antislashe  : ".$nb_remplacement;
    	}
    j'ai la même réponse (smiley + le double point) avec en plus :
    nb de remplacement antislashe : 1
    En clair : preg_replace détecte bien l'anti-slash, mais place le caractère de remplacement au mauvais endroit ! (juste avant ..ou après le point de la fin de la chaine originale ".php")

    Bug de preg_replace ???

  6. #6
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    183
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 183
    Par défaut
    En fait Xinul, je pense que preg_quote n'est pas la solution, car si je fait le test suivant (sans preg_quote) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    	$str_chaine_avec_antislash="abcde\2fghijphp"; // renvoi "not found"
    	find_and_replace_antislash($str_chaine_avec_antislash);
    	$str_chaine_avec_antislash="abcde\\2fghijphp"; // renvoi "found" + remplacement ok
    	find_and_replace_antislash($str_chaine_avec_antislash);
    	//***** function *****
    	function find_and_replace_antislash($str_to_detect)
    	{
    	if(preg_match('[\\\]',$str_to_detect)==1) echo "\n found \n";
    	else echo "\n NOT found \n";
    	echo preg_replace('[\\\]','.',$str_to_detect,-1,$nb_remplacement);
    	echo " \n nb de remplacement antislashe  : ".$nb_remplacement;
    	}
    J'ai (avec un smiley monochrome) :


    NOT found
    abcdefghijphp
    nb de remplacement antislashe : 0
    found
    abcde.2fghijphp
    nb de remplacement antislashe : 1
    En fait il semble qu'il faudrait trouver l'équivalent de addslashe.. pour les antislash (addbackslashes ?) et faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    	$str_chaine_avec_antislash="abcde\2fghijphp"; 
    	$str_chaine_avec_antislash=addbackslashes ($str_chaine_avec_antislash);
    Avec tout les pb de manipulation des antislash regex que j'ai déjà.. je sens que developper addbackslashes va etre simple...

    Le premier qui me dit que les regex font gagner du temps...:

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [HTML] un anti-slash en html
    Par ghyosmik dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 23/05/2006, 15h11
  2. Des anti-slashes dans ma newsletter
    Par dolphi dans le forum Langage
    Réponses: 3
    Dernier message: 09/02/2006, 19h54
  3. anti-slash té
    Par ryan dans le forum Langage
    Réponses: 4
    Dernier message: 22/01/2006, 17h13
  4. Réponses: 10
    Dernier message: 24/10/2005, 16h37
  5. SELECT qui ne retourne rien à cause d'anti-slash
    Par mikyfpc dans le forum Outils
    Réponses: 8
    Dernier message: 07/08/2005, 23h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo