2012-05-11 5 views
0

J'ai une chaîne comme ceci:Regex correspondant à plusieurs lignes plusieurs fois

Name: John Doe 

Age: 23 

Primary Language: English 

Description: This is a multiline 
description field that I want 
to capture 

Country: Canada 

Ce ne sont pas les données réelles, mais vous pouvez voir ce que je suis en train de faire. Je veux utiliser regex pour obtenir un tableau des champs "clés" (Nom, Âge, Langue Primaire, Description, Pays) et leurs valeurs.

J'utilise PHP.

Ma tentative est de ce type, mais il ne fonctionne pas:

preg_match('/^(.*?\:) (.*?)(\n.*?\:)/ism', $text, $matches); 
+0

Il y a un \ n mais vos modificateurs disent que chaque nouvelle ligne est une nouvelle chaîne. Et le . correspond également \ n –

+0

Je suppose que les données sont renseignées par un utilisateur. Les données proviennent-elles d'un '$ _POST' ou d'une base de données? – Biotox

Répondre

1

est ici une solution: http://rubular.com/r/uDgXcIvhac.

\s*([^:]+?)\s*:\s*(.*(?:\s*(?!.*:).*)*)\s* 

Notez que je l'ai utilisé une affirmation négative de préanalyse, (?!.*:). C'est la seule façon de vérifier que la ligne suivante ne ressemble pas à un nouveau champ, et en même temps continuer là où vous vous étiez arrêté. (Ceci est la raison pour laquelle les retards de recherche et de recherche sont connus sous le nom assertions de largeur nulle.)

EDIT: bit supprimé à propos des retards arbitraires; Je me trompais. La solution ci-dessus est bien.

Questions connexes