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 :

capture chaine de caractère


Sujet :

Langage PHP

  1. #1
    Membre actif
    Inscrit en
    Septembre 2004
    Messages
    450
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 450
    Points : 267
    Points
    267
    Par défaut capture chaine de caractère
    Bonjour,

    Je n'arrive pas match la chaine ci-dessous, je ne comprens pas, pouvez-vous m'aider s'il vous plait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?php
    $a="Officiel : l\'AB fffff ";
     
    echo "<br>Retour :".preg_match('# l\'AB #',$a)."<br>";
    echo "<br>Retour :".preg_match('# l\\\'AB #',$a)."<br>";
    echo "<br>Retour :".preg_match("# l\\'AB #",$a)."<br>";
    echo "<br>Retour :".preg_match("# l\\'AB #",$a)."<br>";
    echo "<br>Retour :".preg_match("# l\'AB #",$a)."<br>";
    echo "<br>Retour :".preg_match("# l'AB #",$a)."<br>";
    ?>

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Retour :0
     
    Retour :0
     
    Retour :0
     
    Retour :0
     
    Retour :0
     
    Retour :0
    Merci beaucoup pour votre aide

  2. #2
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    Essaie ceci.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <?php
    $a="Officiel : l\'AB fffff ";
     
    echo "<br>Retour :".preg_match("#\sl\\\'AB\s#",$a)."<br>";
    ?>
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

  3. #3
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Est-ce que ta vraie donnée c'est
    Officiel : l\'AB fffff
    ou
    Officiel : l'AB fffff

    car dans le deuxième cas en PHP il n'y a pas de \ à mettre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $a="Officiel : l'AB fffff ";
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  4. #4
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 847
    Points : 6 531
    Points
    6 531
    Par défaut
    Tu y étais presque! Le problème c'est qu'il y a deux couches à prendre en compte, celle qui interprète les chaînes de caractères et celle qui interprète la pattern. Avec ces deux couches, si on devait établir une règle, elle devrait se résumer à une phrase: Il faut éviter l'ambiguïté.

    Tu peux écrire preg_match('# l\\\\\'AB #',$a) ou preg_match("# l\\\\'AB #",$a) ou encore preg_match("# l\\\'AB #",$a).
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  5. #5
    Membre actif
    Inscrit en
    Septembre 2004
    Messages
    450
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 450
    Points : 267
    Points
    267
    Par défaut
    Citation Envoyé par sabotage Voir le message
    Est-ce que ta vraie donnée c'est
    Officiel : l\'AB fffff
    ou
    Officiel : l'AB fffff

    car dans le deuxième cas en PHP il n'y a pas de \ à mettre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $a="Officiel : l'AB fffff ";
    M'a vraie donnée est : Officiel : l\'AB fffff

  6. #6
    Membre actif
    Inscrit en
    Septembre 2004
    Messages
    450
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 450
    Points : 267
    Points
    267
    Par défaut
    Citation Envoyé par CosmoKnacki Voir le message
    Tu y étais presque! Le problème c'est qu'il y a deux couches à prendre en compte, celle qui interprète les chaînes de caractères et celle qui interprète la pattern. Avec ces deux couches, si on devait établir une règle, elle devrait se résumer à une phrase: Il faut éviter l'ambiguïté.

    Tu peux écrire preg_match('# l\\\\\'AB #',$a) ou preg_match("# l\\\\'AB #",$a) ou encore preg_match("# l\\\'AB #",$a).
    Cela fonctionne, merci beaucoup, par contre je comprends pas pour l'expression entouré par des simple quotes :
    Le pourquoi de mettre 5 "\" preg_match('# l\\\\\'AB #',$a) ???

    Est aussi pourquoi dans 2 expression entourés par des guillemets, le fait que l'on mettre 4 ou bien 3 "\" cela fonctionne ?
    preg_match("# l\\\\'AB #",$a)preg_match("# l\\\'AB #",$a)
    Merci beaucoup

  7. #7
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 847
    Points : 6 531
    Points
    6 531
    Par défaut
    Les chaînes entre quotes simples ou doubles (première couche):

    À la base un antislash se représente par lui-même comme n'importe quel caractère:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    echo 'a\b'; # a\b
    echo "a\b"; # a\b
    Mais l'antislash n'est pas un caractère comme les autres car c'est précisément lui qui est utilisé pour l'échappement dans les chaînes simple quote, double quote et heredoc.

    L'échappement d'un caractère consiste à signifier, en plaçant un antislash avant lui, que le dit caractère n'est pas à prendre dans son sens habituel. Exemples:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    echo '\''; # échappement du 2nd quote pour signifier qu'il ne marque pas la fin de chaîne
    # '
     
    echo '\\'; # là on signifie que le deuxième antislash n'est pas un caractère d'échappement (afin qu'il n'échappe pas le quote de fin de chaîne)
    # \
     
    echo 'a\tb'; # les séquences d'échappements ne sont pas interprétées entre simple quotes
    # a\tb
     
    echo "a\tb"; # il ne s'agit pas d'un antislash puis d'un "t" mais de la séquence "\t" représentant une tabulation
    # a	b
     
    echo "a\\tb"; # si je veux afficher un antislash et un "t", j'échappe l'antislash comme précédemment
    # a\tb
    Il en découle qu'un antislash peut être représenté de deux manières:
    • soit par un seul antislash si le caractère suivant ne voit pas sa signification modifiée par sa présence, comme c'est le cas pour a\b.
    • soit par deux antislashes.


    Donc si je veux représenter la chaîne l\'AB entre double quotes, je peux l'écrire indifféremment: "l\'AB" ou "l\\'AB". Par contre si je veux représenter cette même chaîne entre simple quotes je ne peux écrire que 'l\\\'AB' avec les deux premiers antislashes qui figure l'antislash littéral, et le troisième qui échappe le simple quote pour éviter que la chaîne ne se termine. Je ne peux pas écrire 'l\'AB' car l'antislash servant à échapper le quote ne sera pas affiché, et encore moins 'l\\'AB' car la chaîne s'arrêterait prématurément.

    À noter que dans une chaîne nowdoc, comme aucune séquence d'échappement n'est interprétée et qu'il n'y aucune limite de chaîne à échapper, l'antislash se représente toujours par un seul antislash, ce qui peut s'avérer utile pour simplifier l'écriture.

    La pattern regex (deuxième couche):

    Là où ça se complique c'est que l'antislash sert également de caractère d'échappement dans les patterns regex (pour échapper les caractères spéciaux ( ) [ { . ? + * | ^ $ \ parmi lesquels il figure d'ailleurs, pour les classes de caractères \w \W \d \D \s \S \p{truc} \P{bidule}, pour les ancres \A \z \b \B, l'alias \R, les références aux groupes, aux captures...)

    C'est pourquoi il faut tout ré-échapper une deuxième fois! Il faut donc transmettre non plus la chaîne l\'AB mais la chaîne l\\'AB.

    À la limite, pour ne pas se casser la tête, on pourrait utiliser preg_quote qui le fera tous seul comme un grand pour les parties littérales de la chaîne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $pattern = "#" . preg_quote(" l\'AB ", "#") . "#";
    // ou $pattern = "#" . preg_quote(" l\\'AB ", "#") . "#";
    // ou $pattern = "#" . preg_quote(' l\\\'AB ', "#") . "#";
    echo $pattern; // # l\\'AB #
    ou encore utiliser la syntaxe nowdoc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $pattern = <<<'EOF'
    # l\\'AB #
    EOF;
    Pour ce qui est des chaînes entre quotes la difficulté est alors d'avoir à représenter deux antislashes consécutifs. Donc d'après ce qu'on a vu précédemment, on peut le faire avec trois antislashes (les deux premiers figureront le premier antislash littérale et le dernier le second) ou quatre antislashes (deux pour chaque antislash littérale). Ainsi on peut écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $pattern = "# l\\\'AB #";
    // ou bien
    $pattern = "# l\\\\'AB #";
    Si je veux l'écrire entre simple quotes, s'ajoute la contrainte du simple quote qu'il faut échapper qui me force à utiliser deux antislashes pour chaque antislash littéral afin que le 5e antislash échappe le simple quote:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $pattern = '# l\\\\\'AB #';
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  8. #8
    Membre actif
    Inscrit en
    Septembre 2004
    Messages
    450
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 450
    Points : 267
    Points
    267
    Par défaut
    Citation Envoyé par CosmoKnacki Voir le message
    Les chaînes entre quotes simples ou doubles (première couche):

    À la base un antislash se représente par lui-même comme n'importe quel caractère:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    echo 'a\b'; # a\b
    echo "a\b"; # a\b
    Mais l'antislash n'est pas un caractère comme les autres car c'est précisément lui qui est utilisé pour l'échappement dans les chaînes simple quote, double quote et heredoc.

    L'échappement d'un caractère consiste à signifier, en plaçant un antislash avant lui, que le dit caractère n'est pas à prendre dans son sens habituel. Exemples:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    echo '\''; # échappement du 2nd quote pour signifier qu'il ne marque pas la fin de chaîne
    # '
     
    echo '\\'; # là on signifie que le deuxième antislash n'est pas un caractère d'échappement (afin qu'il n'échappe pas le quote de fin de chaîne)
    # \
     
    echo 'a\tb'; # les séquences d'échappements ne sont pas interprétées entre simple quotes
    # a\tb
     
    echo "a\tb"; # il ne s'agit pas d'un antislash puis d'un "t" mais de la séquence "\t" représentant une tabulation
    # a	b
     
    echo "a\\tb"; # si je veux afficher un antislash et un "t", j'échappe l'antislash comme précédemment
    # a\tb
    Il en découle qu'un antislash peut être représenté de deux manières:
    • soit par un seul antislash si le caractère suivant ne voit pas sa signification modifiée par sa présence, comme c'est le cas pour a\b.
    • soit par deux antislashes.


    Donc si je veux représenter la chaîne l\'AB entre double quotes, je peux l'écrire indifféremment: "l\'AB" ou "l\\'AB". Par contre si je veux représenter cette même chaîne entre simple quotes je ne peux écrire que 'l\\\'AB' avec les deux premiers antislashes qui figure l'antislash littéral, et le troisième qui échappe le simple quote pour éviter que la chaîne ne se termine. Je ne peux pas écrire 'l\'AB' car l'antislash servant à échapper le quote ne sera pas affiché, et encore moins 'l\\'AB' car la chaîne s'arrêterait prématurément.

    À noter que dans une chaîne nowdoc, comme aucune séquence d'échappement n'est interprétée et qu'il n'y aucune limite de chaîne à échapper, l'antislash se représente toujours par un seul antislash, ce qui peut s'avérer utile pour simplifier l'écriture.

    La pattern regex (deuxième couche):

    Là où ça se complique c'est que l'antislash sert également de caractère d'échappement dans les patterns regex (pour échapper les caractères spéciaux ( ) [ { . ? + * | ^ $ \ parmi lesquels il figure d'ailleurs, pour les classes de caractères \w \W \d \D \s \S \p{truc} \P{bidule}, pour les ancres \A \z \b \B, l'alias \R, les références aux groupes, aux captures...)

    C'est pourquoi il faut tout ré-échapper une deuxième fois! Il faut donc transmettre non plus la chaîne l\'AB mais la chaîne l\\'AB.

    À la limite, pour ne pas se casser la tête, on pourrait utiliser preg_quote qui le fera tous seul comme un grand pour les parties littérales de la chaîne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $pattern = "#" . preg_quote(" l\'AB ", "#") . "#";
    // ou $pattern = "#" . preg_quote(" l\\'AB ", "#") . "#";
    // ou $pattern = "#" . preg_quote(' l\\\'AB ', "#") . "#";
    echo $pattern; // # l\\'AB #
    ou encore utiliser la syntaxe nowdoc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $pattern = <<<'EOF'
    # l\\'AB #
    EOF;
    Pour ce qui est des chaînes entre quotes la difficulté est alors d'avoir à représenter deux antislashes consécutifs. Donc d'après ce qu'on a vu précédemment, on peut le faire avec trois antislashes (les deux premiers figureront le premier antislash littérale et le dernier le second) ou quatre antislashes (deux pour chaque antislash littérale). Ainsi on peut écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $pattern = "# l\\\'AB #";
    // ou bien
    $pattern = "# l\\\\'AB #";
    Si je veux l'écrire entre simple quotes, s'ajoute la contrainte du simple quote qu'il faut échapper qui me force à utiliser deux antislashes pour chaque antislash littéral afin que le 5e antislash échappe le simple quote:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $pattern = '# l\\\\\'AB #';

    Merci beaucoup pour cette explication très ludique !!! C'est vraiment sympas

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

Discussions similaires

  1. capture chaine de caractères
    Par omelhor dans le forum Langage
    Réponses: 6
    Dernier message: 04/11/2014, 13h40
  2. Réponses: 9
    Dernier message: 23/12/2013, 17h40
  3. [RegEx] Capture d'un paramètre dans une chaine de caractères
    Par Niki59 dans le forum Langage
    Réponses: 2
    Dernier message: 10/07/2013, 16h00
  4. Lire Une Chaine De Caractères
    Par Jonathan_Korvitch dans le forum C
    Réponses: 12
    Dernier message: 07/01/2003, 06h37
  5. Réponses: 2
    Dernier message: 06/12/2002, 08h50

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