Capture groupe en fin d'URL

Yann - 3 févr. 2022 à 11:39
Whismeril Messages postés 19034 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 2 mai 2024 - 3 févr. 2022 à 17:23
Bonjour à tous,
Je suis en train de me prendre la tête dessus, donc, je demande au cas ou :)

Dans le cadre d'un tableau sur Data Studio, j'essaye d'afficher un groupe de caractère terminant les URL d'un site web :
en gros, les URL sont construites toutes comme ça dossier/mon-url-AZ19/
le AZ19 correspondant au code alphanumérique que je veux isoler (qui d'ailleurs ne répond à aucune règle pratique, il peut faire de 3 à 6 caractères, n'avoir que des chiffres, etc..)

J'y parviens sans difficulté avec
([^-]+)/$

ce qui me permet bien de sortir mon AZ19

Sauf que, mauvaise surprise (et worpdress oblige) je découvre des pages avec comme URL dossier/mon-url-AZ19-2/
Ma regex renvoyant désormais le 2 au lieu du AZ19
Et là, je coince.. Comment, dans mon expression régulière, puis-je récupérer mon AZ19 en ignorant un éventuel -2 (ou -3, soyons fous) qui pourrait le suivre ?

Voilà, si y'a des habitués des expressions régulières, je suis preneur :)

Merci d'avance

1 réponse

Whismeril Messages postés 19034 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 2 mai 2024 656
3 févr. 2022 à 17:23
Bonjour

Il existe des sites en ligne qui permettent de tester ses regex. Selon le moteur de regex que tu utilises il faut choisir le bon site
Je supposais que WordPress utilise le moteur de PHP >= 7.3, j’ai donc choisi regex101 et je l’ai configuré avec ce moteur.
Mais avec ta regex il m’a demandé d’échapper le / final. Du coup WordPress se sert peut-être d’un autre moteur. Il faudra vérifier.

Bref. Ta regex a un autre défaut.
Comme regex101 permet de sauver des tests et conserver l’URL.
Je t’ai mis un exemple illustrant l’autre problème
https://regex101.com/r/gIVluG/1

Comme tu peux le voir AZ&19 est accepté.

Tu as dit ne vouloir que des chiffres et des lettres (majuscules, minuscules, avec ou sans accent)
Une option est d’utiliser
\w
mais cette instruction accepte aussi les signes de ponctuation selon les moteurs.

Pour avoir uniquement des chiffres il y a
\d
.
Pour avoir uniquement des lettres majuscules sans accents, il y a
[A-Z]

Si on combine les 2 on obtient
https://regex101.com/r/gIVluG/2

Le & est rejeté mais 19 est capturé. On va donc conditionner au fait qu’avant la capture il doit y avoir un - avec
(?<=-)
avant
https://regex101.com/r/gIVluG/3

De la même façon, on peut enlever le / de fin de la capture, en spécifiant qu’il est après la capture
https://regex101.com/r/gIVluG/4

Et maintenant, il reste à indiquer qu’il peut y avoir un - suivi d’un chiffre 0 ou 1 fois, après la capture avec
 (-\d)? 

https://regex101.com/r/gIVluG/5

Ce qui donne
 (?<=-)([\dA-Z]+)(-\d)?(?=\/$) 


Par contre, on est obligé de garder cette dernière condition dans la capture sinon, la regex trouve AZ19 et 2.
On peut faire en sorte que le - chiffre, ne constitue pas un groupe

 (?<=-)([\dA-Z]+)(?:-\d)?(?=\/$) 

0
Rejoignez-nous