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 :

Casse tête exclusion caractère [RegEx]


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Inscrit en
    Octobre 2009
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 52
    Points : 25
    Points
    25
    Par défaut Casse tête exclusion caractère
    Bonjour à tous,

    Je suis face à un problème que je peine à résoudre.


    J'utilise une application pour faire des rechercher/remplacer.
    Je recherche environ 300 expression, que je remplace par cette même expression balisée.
    Exemple :
    Cherche "XYZ 1 mars 2020" Remplace par <balise type="XYZ" jour="1" mois="mars" annee="2020">XYZ 1 mars 2020</balise>

    Le truc, c'est que je peux passer des documents assez important dedans, qui sont déjà balisés. Si j'exécuter mon script à nouveau, je vais baliser à nouveau mon expression :
    <balise type="XYZ" jour="1" mois="mars" annee="2020"><balise type="XYZ" jour="1" mois="mars" annee="2020">XYZ 1 mars 2020</balise></balise>

    J'ai trouvé une pseudo parade en commençant chaque expression à trouver par [^>]. Cela fonctionne, je ne balise plus deux fois la même expression. En revanche, comme j'exclus le ">", l'expression comprend qu'il faut quand même prendre n'importe quel caractère qui précède mon expression, sauf le ">".
    Je reconnait donc ".XYZ 1 mars 2020" ou ":XYZ 1 mars 2020" etc. (je mets une ponctuation mais bien souvent ça choppe des espaces.

    Savez vous comment je peux trouver une parade pour évider de boucler dans ma recherche ? Ci ce n'est pas assez claire je vous fournirai plus d'informations.

    Merci d'avance pour votre aide !
    Romain

  2. #2
    Nouveau membre du Club
    Inscrit en
    Octobre 2009
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 52
    Points : 25
    Points
    25
    Par défaut
    En fait, il faudrait que je trouve une sorte de (?!<) -l'expression ne fini par par < mais inversée ! l'expression ne débute pas par >.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Citation Envoyé par Ambuletz Voir le message
    ...Ci ce n'est pas assez claire je vous fournirai plus d'informations...
    Ça dépend... Tu veux des réponses ou pas ?

  4. #4
    Nouveau membre du Club
    Inscrit en
    Octobre 2009
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 52
    Points : 25
    Points
    25
    Par défaut
    Oui j'aimerai bien

    Je simplifie alors !
    J'aimerai pouvoir valider "expression" tout en invalidant ">expression".
    Mon problème avec ma requête [^>]expression est que ça invalide bien ">expression" mais dans le cas ou ça fonctionne, ça récupère le caractère qui précède "expression" à savoir " expression" (je m'enfonce ?)

    J'ai essayé avec ^(?!>)expression, mais là ça ne fonctionne que si mon expression se trouve tout au début, et non en plein texte.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Le minimum est de :

    • montrer ton code (tes essais de regex) : on ne va pas le deviner... Ni partir de zéro.
    • définir clairement etexhaustivement la structure à chercher ("XYZ" ?? ...)
    • fournir un exemple de texte à traiter (pour faire des tests)

    Non ?

  6. #6
    Nouveau membre du Club
    Inscrit en
    Octobre 2009
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 52
    Points : 25
    Points
    25
    Par défaut
    Excusez-moi, je voulais simplifier au maximum mais ce n'était pas très malin.

    Je prends comme exemple la regex suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (Cass\.\s+com\.(?:,\s+(?:avis|QPC))?,\s+(\d{1,2})e?r?(?:\s|&nbsp;)+(\w+\.?)\s+(\d{4}),\s+n(?:°|&deg;|o)s?(?:\s|&nbsp;)+(\d{2}-\d{2})\.?(\d{3}))
    je la recherche et je la remplace par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <renvoi type="CASS" refid="$5$6" jour="$2" mois="$3" annee="$4">$1</renvoi>
    Ce qui pour l'expression suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cass. com., 5 janvier 2012, n° 12-45.644
    Me donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <renvoi type="CASS" refid="12-45644" jour="5" mois="janvier" annee="2012">Cass. com., 5 janvier 2012, n° 12-45.644</renvoi>
    Voilà pour les données. (voici un lien pour la retrouver rapidement sur RegEx101 : https://regex101.com/r/kZmwUI/1 )

    Mon problème : Lorsque je fais mon rechercher/remplacer, ma requête va retrouver mon expression, même si elle a déjà été transformée, ce qui va imbriquer les baises <renvoi>.
    J'aimerai donc modifier mon expression de manière à exclure le caractère ">" au début, mais en faisant [^>] je l'exclu bien mais je prends n'importe quel caractère qui n'est pas un ">" à la place. Ce n'est peut-être pas la meilleurs façon d'arriver à mes fins ?

  7. #7
    Invité
    Invité(e)
    Par défaut
    Ajoute au tout début de ta regex :
    • (?: .... ) : parenthèse non-capturante
    • ^|[^>] : début de ligne ou tout sauf >

  8. #8
    Nouveau membre du Club
    Inscrit en
    Octobre 2009
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 52
    Points : 25
    Points
    25
    Par défaut
    Merci jreaux62,

    à priori, avec cet ajout j'ai le même résultat que [^>]. Ce que je veux dire par là, c'est que le caractère précédent l'expression (qui n'est pas un <) fait toujours parti de l'expression reconnue.

    Romain

  9. #9
    Invité
    Invité(e)
    Par défaut
    Et alors ?

  10. #10
    Nouveau membre du Club
    Inscrit en
    Octobre 2009
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 52
    Points : 25
    Points
    25
    Par défaut
    Le problème, c'est que je récupère ce caractère non souhaité mais que je ne le restitue pas. ce premier caractère manque donc au résultat final

  11. #11
    Invité
    Invité(e)
    Par défaut
    Tu obtiens bien ce que tu veux, au final, non ?

  12. #12
    Nouveau membre du Club
    Inscrit en
    Octobre 2009
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 52
    Points : 25
    Points
    25
    Par défaut
    Pas tout à fait :

    Si on prend cet exemple : https://regex101.com/r/kZmwUI/2 Je perd le point qui se trouve en début de ligne, ce qui est gênant car je touche à l'intégrité de mon document.

    Si je place le début de l'expression dans la première parenthèse, je conserve bien le point, mais il se retrouve balisé dans mon <renvoi> alors que j'aimerai qu'il reste en dehors.

    D'où le casse tête

  13. #13
    Invité
    Invité(e)
    Par défaut
    Compris !

    Il faut simplement :
    • que la 1ère parenthèse SOIT "capturante"
    • modifier la substitution

    Code regex : Sélectionner tout - Visualiser dans une fenêtre à part
    (^|[^>])(................)
    Code regex : Sélectionner tout - Visualiser dans une fenêtre à part
    $1<renvoi type="CASS" refid="$6$7" jour="$3" mois="$4" annee="$5">$2</renvoi>

    Test :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Cass. com., 5 janvier 2012, n° 12-45.644
     
    Lorem ipsum.Cass. com., 5 janvier 2012, n° 12-45.644Lorem ipsum
     
    Lorem ipsum Cass. com., 5 janvier 2012, n° 12-45.644Lorem ipsum
     
    Lorem ipsum !<renvoi type="CASS" refid="12-45644" jour="5" mois="janvier" annee="2012">Cass. com., 5 janvier 2012, n° 12-45.644</renvoi> Lorem ipsum
    Donne :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <renvoi type="CASS" refid="12-45644" jour="5" mois="janvier" annee="2012">Cass. com., 5 janvier 2012, n° 12-45.644</renvoi>
     
    Lorem ipsum.<renvoi type="CASS" refid="12-45644" jour="5" mois="janvier" annee="2012">Cass. com., 5 janvier 2012, n° 12-45.644</renvoi>Lorem ipsum
     
    Lorem ipsum <renvoi type="CASS" refid="12-45644" jour="5" mois="janvier" annee="2012">Cass. com., 5 janvier 2012, n° 12-45.644</renvoi>Lorem ipsum
     
    Lorem ipsum !<renvoi type="CASS" refid="12-45644" jour="5" mois="janvier" annee="2012">Cass. com., 5 janvier 2012, n° 12-45.644</renvoi> Lorem ipsum

  14. #14
    Nouveau membre du Club
    Inscrit en
    Octobre 2009
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 52
    Points : 25
    Points
    25
    Par défaut
    ummmh OK, c'est une manière, et ça fait le boulot, merci beaucoup jreaux62 !

    plus qu'à modifier mes 2000 groupes de capture dans mes 380 expression, un jeu d'enfant

    Encore merci !

  15. #15
    Nouveau membre du Club
    Inscrit en
    Octobre 2009
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 52
    Points : 25
    Points
    25
    Par défaut
    Bonsoir,
    Je me permets de remonter le sujet pour apporter une précision.

    J'ai trouvé un moyen plus simple d'arriver à mes fins et qui fait exactement ce que je cherchais, l'opérateur non précédé par : (?<!<) : https://regex101.com/r/kZmwUI/3

    Si ça peut servir à quelqu'un.
    Romain

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 10/03/2009, 17h05
  2. [Tableaux] Casse têtes de boucles
    Par Anduriel dans le forum Langage
    Réponses: 5
    Dernier message: 28/06/2006, 00h24
  3. requête SQL un peu casse tête
    Par hellbilly dans le forum Langage SQL
    Réponses: 4
    Dernier message: 15/12/2005, 10h03
  4. Classe, pile, pointeurs et casse-tête!
    Par zazaraignée dans le forum Langage
    Réponses: 6
    Dernier message: 26/09/2005, 16h57
  5. casse-tête excel
    Par gregius dans le forum Access
    Réponses: 2
    Dernier message: 21/09/2005, 16h38

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