$regex = '`[arrache de cheveux]{0,100000}?`'

Messages postés
3708
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
- - Dernière réponse : kohntark
Messages postés
3708
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
- 25 juin 2009 à 22:56
Salut,

Je prends la liberté de poster sur le forum regex (peu fréquenté semble t il, snif) et celui ci.

En cette fin de journée fatigante je galère un peu.
Voici la trame que j'essaie de parser :
tototata - 140 db - excellent - truc-bidule - bidule machin

 
140 db, étonnant, 8 pm, theodore

Données bidule, truc (jazz)

en noir : ce que je cherche à capturer (changeant, forcemment)
en bleu : les parties qui ne changent jamais
en rouge : ce qui fait que je vais devenir chauve plus vite que prévu

A savoir qu'il peut y avoir des retours à la ligne et autres caractères "blancs" aléatoires entre la cloture d'une balise et la suivante.

Le problème :
Les données en rouge peuvent prendre les formes suivantes :
140 db, étonnant, 8 pm, theodore

140 db, 8 pm, theodore

140 db, étonnant, 8 pm

140 db, étonnant, machinchose, 8 pm, theodore

8 pm

etc ... en fait le nombre de données, séparées par des virgules (et qui peuvent contenir des chiffres, des caractères spéciaux etc ... mais jamais de virgule), peut changer, avant comme après le 8 pm que je cherche à capturer.
Par ailleurs, pour faciliter grandement la chose, le 8 pm (qui peut également être 208 pm, 102 pm) n'est pas toujours présent.

Pour ceux qui suivent encore après cette magnifique tentative d'explication :
je cherche à trouver le nombre de pm (8 pm) que contient la chaîne, et savoir également, de façon fiable (of course) si elle n'est pas présente.

Les autres données (en noir) ne me pose pas de pb, de même qu'isoler la ligne rouge et appliquer un second traitement dessus pour sortir le 8 pm (mais je souhaiterai le faire en 1 seule regex)

... en espérant m'être bien expliqué (pas gagné, je sais )
Merci d'avance.

Cordialement,

Kohntark -
Afficher la suite 

9 réponses

Messages postés
1305
Date d'inscription
mardi 9 novembre 2004
Statut
Membre
Dernière intervention
21 mai 2015
0
Merci
Aaaaah là y a du challenge... ça change... lol... .. . ;o)

Je suppose que c'est une regexp exécutée sous php... sinon précise le langage... ton 8pm aura toujours cette forme là (num+espace+pm) ou pas... c'est quoi une heure au format anglophone... .. ?

Par contre il y a des chances qu'il faille passer par 2 regexp une pour le (x)pm et une autre pour le reste... je jette un coup d'oeil quand j'aurais 2 minutes et te tiens au fil si je trouve quelque chose... .. .

@ tchaOo°
Commenter la réponse de kankrelune
Messages postés
1305
Date d'inscription
mardi 9 novembre 2004
Statut
Membre
Dernière intervention
21 mai 2015
0
Merci
essaye ça...

/\b([0-9]+\s*pm)\b/i

sur...

140 db, ligne 1, 8 pm, 10pm theodore

db, 2, pm, ligne 2

140 db, étonnant, ligne 4, 100pm, theodore

140db, ligne 40 pm

opsus20pmjkl, ligne 3, 12 pm

dbligne12pmplm

m228 pm fgh
étonnant, ligne 4, 29 pm, theodore

140 db, 140 pmdb,ligne 3, 46pm

10 pm


ça match correctement...

array (
0 => '8 pm',
1 => '10pm',
2 => '100pm',
3 => '40 pm',
4 => '12 pm',
5 => '29 pm',
6 => '46pm',
7 => '10 pm',
),

si ça va pas précise plus en détail sous quelle forme peut se présenter ta variable et ton texte... .. .

@ tchaOo°
Commenter la réponse de kankrelune
Messages postés
1305
Date d'inscription
mardi 9 novembre 2004
Statut
Membre
Dernière intervention
21 mai 2015
0
Merci
Ah... si tu veux qu'il y ai absolument un espace entre ta valeur et on "pm" vire le * après le \s

D'ailleurs remplace le \s par un espace il serait capable de te matcher

plopmon text 20
pm remontext

^_^

@ tchaOo°
Commenter la réponse de kankrelune
Messages postés
6069
Date d'inscription
dimanche 13 avril 2003
Statut
Modérateur
Dernière intervention
15 juillet 2011
21
Commenter la réponse de nhervagault
Messages postés
2382
Date d'inscription
lundi 4 février 2002
Statut
Membre
Dernière intervention
29 décembre 2012
11
0
Merci
Alors, juste un passage en vitesse.. tu utilises SPL avec Tidy ?? Des fois ça aide pas mal.. mais attention PHP 5.3 obligé.
S.
Commenter la réponse de syndrael
Messages postés
1305
Date d'inscription
mardi 9 novembre 2004
Statut
Membre
Dernière intervention
21 mai 2015
0
Merci
Je vois pas le rapport entre SPL/Tidy et la rexexp que veut kohntark... .. .

@ tchaOo°
Commenter la réponse de kankrelune
Messages postés
2382
Date d'inscription
lundi 4 février 2002
Statut
Membre
Dernière intervention
29 décembre 2012
11
0
Merci
Je pensais que SPL/Tidy aurait permis de trouver H3.. puis le Span juste après via la classe TidyNode récupérer le tototatat qu'il cherche.. mais ce n'était qu'une piste.. Et puis aussi que j'aime bien utiliser les dernières fonctions sorties.
Ce n'était qu'une piste..
S.
Commenter la réponse de syndrael
Messages postés
1305
Date d'inscription
mardi 9 novembre 2004
Statut
Membre
Dernière intervention
21 mai 2015
0
Merci
Ah oki... .. . :o)

Oui effectivement on peut passer par le DOM aussi mais je ne pense pas que ce soit adapté dans cette situation... beaucoup trop de code là ou une regexp suffit je pense... .. .

@ tchaOo°
Commenter la réponse de kankrelune
Messages postés
3708
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
21
0
Merci
Merci pour ta réponse Syndrael.
Comme Kankrelune je ne pense pas que cela soit adapté. Cela étant je connais très peu.
Pour info j'ai répondu sur le forum regex : http://regex.codes-sources.com/forum/sujet-REGEXP-CAPTURE-DONNEES_1330084.aspx#1

Cordialement,

Kohntark -
Commenter la réponse de kohntark