Aide sur une regex

Aide sur une regex - PHP - Programmation

Marsh Posté le 22-02-2018 à 20:39:03    

Bonjour,
 
Je ne sais pas si je suis au bon endroit, je m'en excuse par avance, je ne sais pas trop où poster ça.  :jap:  
 
Pour en venir à ma demande :
Voici ce que je veux matcher avec la regex :
 
dont want {dont want 'want this', 'want this, je m\'appelle Robert', dont want}
'dont want'
 
Du coup, les chaînes de caractères qui sont entre simple quotes, uniquement dans des accolades. Je veux aussi gérer les "escape" pour pouvoir mettre des phrases avec des apostrophes.
J'ai trouvé une regex qui match les quotes et gère les escape, et une autre qui gère les accolades mais pas les escape, et je ne m'en sors pas.  :sweat:  
Les deux regex trouvées :
 
quotes dans les accolades sans escape
'[^']*'(?=[^{']*('[^']*'[^'{]*)*\})
 
quotes seules avec escape
\'([^\'\\]*(\\.[^\'\\]*)*)\'
 
Merci d'avance pour votre aide.

Reply

Marsh Posté le 22-02-2018 à 20:39:03   

Reply

Marsh Posté le 23-02-2018 à 19:56:54    

Hello,
 
Est-ce indispensable de faire ça en une seule regex ?
 
Sinon, je te suggère de d'abord récupérer ce qui se trouve entre accolades :

(?<!\\){(.*?)(?<!\\)}

https://regex101.com/r/vC5e2H/2/
 
Ensuite pour chaque match, tu récupères ce qu'il y a entre quotes :

(?<!\\)'(.*?)(?<!\\)'

https://regex101.com/r/sVlj8L/1


Message édité par sielfried le 23-02-2018 à 19:57:20

---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 23-02-2018 à 22:56:47    

Salut,
 
Je suggère de même de découper en plusieurs étapes, sinon voilà un résultat pas trop mal :

Code :
  1. /'([^'}{\\]*(?:\\')?[^'}{\\]*)'(?=(?:[^'}{\\]*(?:'[^'}{\\]*(?:\\')?[^'}{\\]*'?)?[^'}{\\]*)\})/gm


https://regex101.com/r/ZjI04C/2
 [:psywalk]  
Évidemment mon regex ne prend pas en compte les imbrications.

Message cité 1 fois
Message édité par MaybeEijOrNot le 23-02-2018 à 23:00:37

---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
Reply

Marsh Posté le 24-02-2018 à 01:53:44    

MaybeEijOrNot a écrit :

Salut,
 
Je suggère de même de découper en plusieurs étapes, sinon voilà un résultat pas trop mal :

Code :
  1. /'([^'}{\\]*(?:\\')?[^'}{\\]*)'(?=(?:[^'}{\\]*(?:'[^'}{\\]*(?:\\')?[^'}{\\]*'?)?[^'}{\\]*)\})/gm


https://regex101.com/r/ZjI04C/2
 [:psywalk]  
Évidemment mon regex ne prend pas en compte les imbrications.


 
Pas mal, par contre ça a le ptit inconvénient de capturer aussi les parties de texte sans accolade ouvrantes, type

'truc' } 'machin' }


Message édité par sielfried le 24-02-2018 à 01:55:05

---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 24-02-2018 à 10:50:05    

Oui, on voit bien que j'ai supposé que si on ferme une accolade c'est qu'une avait été ouverte avant, et tout comme ça ne gère pas les imbrications, il faut une chaîne un tant soit peu formatée. Il doit y avoir d'autres bugs, comme par exemple l'introduction d'accolades dans les parties à capturer mais bon ça rejoint en partie l'imbrication.

 

Mais c'est pour ça que comme toi je conseille de faire en plusieurs étapes si on veut vraiment quelque chose de propre. De toute façon je ne vois aucun intérêt de faire en une seule étape, ce n'est pas moins gourmand en performances. Au contraire, en général, ça l'est bien plus, les étapes permettent d'optimiser le nombre de vérifications.


Message édité par MaybeEijOrNot le 24-02-2018 à 10:50:32

---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed