2012-02-27 4 views
0

Après des heures d'essayer d'envelopper la tête autour de correspondance de motif, je jette la serviette et se tourner vers les experts ...RegEx modèle Aide (php)

J'ai un fichier journal que je suis en train pour extraire une chaîne de.

Le format est:

12:00 SomeText: 
1:20 MoreText: 

Le "someText/moreText" est ce que je dois faire. Je suis venu avec le code ci-dessous, mais rien ne se passe près des résultats que je me attends:

$string = "12:00 SomeText: blah, blah, blah not important"; 
$regex = '/[0-9]:[0-9] (.*?)\: /'; 
$entity = preg_split($regex, $string); 

La logique de regex que je comprends est, un nombre, suivi par deux points, suivi par un nombre quelconque, suivi d'un espace blanc, le texte, suivi d'un deux-points, suivi d'un espace blanc

Une poussée dans la bonne direction serait grandement appréciée!

Merci Chris

+0

Pouvez-vous développer le format que vous recevez? Quels sont les délimiteurs? Espaces, onglets ...? – m0skit0

Répondre

3

Vous êtes correspondant à un seul chiffre, deux points, puis un seul chiffre.

$string = "12:00 SomeText: blah, blah, blah not important"; 
$regex = '/[0-9]+:[0-9]+ ([^:]+)/'; 
$entity = array(); 
preg_match($regex, $string, $entity); 

Ceci correspond à un ou plusieurs chiffres, un deux-points, un ou plusieurs chiffres, le reste. preg_match mettrez toute expression de correspondance (12:00 Une partie du texte) en position 0, et les sous-expressions appariés (Certains texte) après que, si votre « partie du texte » sera $entity[1]

[Modifier] Après la discussion dans les commentaires, j'ai amélioré la correspondance avec l'en-tête. Avant, vous aviez

(.*?)\: 

qui trouvera un caractère, jusqu'à la fin de la chaîne, le cas échéant, et puis revenir en arrière jusqu'à ce qu'il trouve le côlon. Je l'ai remplacé par

([^:]+) 

qui trouvera un ou plusieurs caractères qui ne sont pas des deux-points, et de les faire correspondre. Cela évite à l'expression rationnelle de regarder "bla, bla, bla ..." et ensuite d'ignorer ce qu'elle vient de trouver.

+1

me battre à elle. bien que je ne vois pas pourquoi le deuxième colon est échappé, soit. –

+0

Je pensais qu'il avait cela parce qu'il voulait seulement l'en-tête, la partie entre le temps et le côlon agissant comme séparateur d'en-tête. @Chris Sprague, si vous pouvez clarifier cela, je peux rendre l'expression rationnelle un peu plus efficace. –

+0

En effet, j'essaye d'attraper juste la partie "SomeText" de la chaîne. –