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 :

Problème avec une apostrophe. [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre éclairé Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Par défaut Problème avec une apostrophe.
    Bonjour,

    Je veux m'assurer de la présence d'un motif dans un fichier mais
    j'ai un probleme avec une apostrophe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    preg_match("#<h1>\s*Titre de l'article\.\s*</h1>#Uis", $txt)
    j'ai aussi essayé avec l'échappement \ :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_match("#<h1>\s*Titre de l\'article\.\s*</h1>#Uis", $txt)
    mais le problème persiste, le motif n'est pas reconnu alors qu'il
    est bien présent dans le fichier.
    Les magic_quote sont à off dans mon php.ini donc je ne comprend vraiment pas
    d'où vient l'erreur.

    Quelqu'un pouraait m'aider ?

    Merci

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    Bonjour,


    Je pense que ce n'est pas un problème d'apostrophe mais d'antislash. Essaie

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "#<h1>\s*Titre de l'article\\.\s*</h1>#Uis"


    Il y a beaucoup de particularités concernant les antislashes. Je connais surtout Python, je ne sais pas si les choses sont identiques entre Python et PHP concernant l'antislash. Je me garde donc de donner plus des explications qui pourraient se révéler fausses.

    Fais un retour pour dire si deux antislashes changent quelque chose, stp.

  3. #3
    Membre éclairé Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Par défaut
    salut,

    Non l'antislash n'est pas en cause ici. J'ai testé ton exemple mais
    le résultat est le même.
    Par contre le simple code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <?php
    $txt="<h1>Titre de l'article.</h1>";
    if(preg_match("#<h1>\s*Titre de l'article\.\s*</h1>#Uis", $txt))
    echo "OK";
    ?>
    fonctionne .

    Donc je comprend pas....

    Si quelqu'un a une idée.

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    Et c'est quel code qui ne fonctionnait pas avant ?
    Parce que dans le message #1, tu écris bien
    j'ai un probleme avec une apostrophe:
    mais ça ne renseigne pas précisément sur les conditions de l'observation du problème.





    Pour ce qui est de l'antislash, ce doit être comme en Python: l'affichage d'une valeur de type chaîne contenant un antislash ne comporte qu'UN caractère antislash, mais l'affichage de la représentation interne d'une valeur de type chaîne contenant un antislash se fait au moyen de deux antislash.

    En quelque sorte, les chaînes de définition d'une valeur chaîne (c'est à dire les chaînes écrites dans un code) et les chaînes d'affichage comportent des caractères antislashes, tandis que les représentations internes des valeurs chaînes comportent des signes antislashes, et l'affichage d'un signe antislash se fait par deux caractères antislashes.



    Ainsi, pour représenter dans une chaîne de définition (une chaîne qu'on écrit dans un code) un antisalsh, il faudrait normalement écrire deux antislashes dans la chaîne écrite.

    Mais si on n'écrit qu'un caractère dans une telle chaîne, l'interpréteur PHP, ou je ne sais quel autre bidule qui s'occupe de ça, est intelligent et comprend quand même qu'il s'agit d'un antislash qu'il doit représenter dans une représentation interne par un signe antislash.... qui sera tout de même affiché sous forme de deux caractères antislashes en affichage quand on fera afficher la chaîne, malgré la façon dont on l'a écrite.




    Désolé si c'est compliqué, c'est le sujet qui l'est et c'est comme ça que je le comprends.

    D'ailleurs c'est tellement compliqué et tordu à expliquer, d'autant plus quand on y mêle les regex, que je ne suis pas sûr d'avoir vraiment tout compris sur ces questions.



    Mais en conclusion, ton problème n'est pas un problème d'antislash: l'interpréteur PHP, ou je ne sais quoi qui fait les manips, transforme bien l'antislash unique de ta chaîne écrite en une représentation interne correcte d'antislash.





    Reste à comprendre le pourquoi de tes observations.

    Et pour cela à connaître d'abord quelle était l'observation dont tu parlais dans le message #1 ?

  5. #5
    Membre éclairé Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Par défaut
    Oulaah j'espère que tu as une boite d'aspirine à porté de main.

    Bon, réglons l'affaire des antislashes:

    Ils ne sont pas en cause ici.
    Dans une regex un antislash "déspécialise" un métacaractère, dans mon exemple
    le point qui veut dire: tout les caractères imprimables, donc:
    permet de transformer le métacaractère '.' en un simple point.

    Dans une regex un antislash peut aussi être utilisé pour représenter une
    classe de caractère ex: \s qui représente un espace, une tabulation ou un retour chariot.
    Donc les antislashes dans la regex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #<h1>\s*Titre de l'article\.\s*</h1>#Uis
    remplissent parfaitement leur fonction.

    Maintenant pour en revenir à ce foutu apostrophe, si par ex je l'enlève (dans la regex et dans le fichier bien sûr) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #<h1>\s*Titre de larticle\.\s*</h1>#Uis
    ça fonctionne.
    Preuve que c'est bien l'apostrophe qui met le bazar.
    Maintenant je serais bien curieux de savoir pourquoi.

    Une idée ?

  6. #6
    Membre éclairé Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Par défaut
    Bon ça y est j'ai trouvé... 'pas trop tôt !

    En fait je code dans un CMS, et la variable $txt utilisée est formatée
    par htmlentities, ce qui fait qu'une apostrophe est codée:
    note: j'ai laissé un espace entre le & et le # sinon ce code serait
    transformé en apostrophe... logique

    ma regex ne risquait donc pas de trouver le motif.
    Voici donc la bonne regex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_match("!<h1>\s*Titre de l&\#39;article\.\s*</h1>!Uis", $txt);
    Voilà, si ça peut aider quelqu'un.

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

Discussions similaires

  1. problème avec l'apostrophe dans une requête
    Par mika0102 dans le forum VBA Access
    Réponses: 7
    Dernier message: 09/03/2019, 17h51
  2. Problème avec une instruction OUTER /Postgres
    Par Volcomix dans le forum Langage SQL
    Réponses: 14
    Dernier message: 21/04/2004, 17h56
  3. problème avec une requête imbriquée
    Par jaimepasteevy dans le forum Langage SQL
    Réponses: 13
    Dernier message: 05/12/2003, 11h29
  4. Problème avec les apostrophes
    Par misterbillyboy dans le forum Requêtes
    Réponses: 2
    Dernier message: 15/07/2003, 17h39
  5. Problème avec une procédure stockée
    Par in dans le forum Langage SQL
    Réponses: 4
    Dernier message: 27/05/2003, 16h33

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