2009-10-05 8 views
0

Je dois trouver une chaîne aléatoire dans une chaîne.Obtention d'une chaîne aléatoire dans une chaîne

Ma chaîne se présente comme suit

{thème} rose {/ thème} ou {thème} rouge {/ thème}

Je dois obtenir le texte entre les balises, le texte peut être différent après chaque rafraîchir.

Mon code se présente comme suit

$str = '{theme}pink{/theme}'; 
preg_match('/{theme}*{\/theme}/',$str,$matches); 

Mais pas de chance avec cela.

+0

} * correspond à zéro ou plusieurs fois l'accolade ... vous pouvez essayer quelque chose comme}. * { –

+0

essayé, et ça revient {theme} pink {/ theme}, j'ai besoin d'obtenir la valeur rose maintenant – Roland

Répondre

0
$matches = array(); 
$str = '{theme}pink{/theme}'; 
preg_match('/{([^}]+)}([^{]+){\/([^}]+)}/', $str, $matches); 

var_dump($matches); 

Cela supprimera toutes les correspondances de tous les "tags" que vous recherchez. Essayez-le et regardez $matches et vous verrez ce que je veux dire. Je suppose que vous essayez de créer votre propre langage de modèle rudimentaire afin que cet extrait de code puisse vous être utile. Si vous êtes, je peux suggérer de regarder quelque chose comme Smarty.

Dans tous les cas, vous avez besoin de parenthèses pour capturer des valeurs dans les expressions régulières. Il y a trois valeurs capturées ci-dessus:

([^}]+) 

capturera la valeur du « tag », ouverture qui est theme. Les [^}]+ signifie « un ou plusieurs caractères quelconques mais le caractère }, ce qui rend ce non gourmand par défaut.

([^{]+) 

capturera la valeur entre les balises. Dans ce cas, nous voulons correspondre à tous les personnages, mais les caractère {.

([^}]+) 

capturera la valeur de la balise de fermeture.

0
preg_match('/{theme}([^{]*){\/theme}/',$str,$matches); 

[^{] correspond à tout caractère sauf l'accolade d'ouverture pour rendre l'expression rationnelle non gourmand, ce qui est important, si vous avez plus d'une étiquette par chaîne/ligne

3

* est seulement le quantificateur, vous avez besoin pour spécifier à quoi sert le quantificateur. Vous l'avez appliqué à}, ce qui signifie qu'il peut y avoir 0 ou plusieurs caractères '}'. Vous voulez probablement "n'importe quel caractère", représenté par un point.
Et vous voulez peut-être capturer seulement la partie entre les {..} balises avec (. *)

$str = '{theme}pink{/theme}'; 
preg_match('/{theme}(.*){\/theme}/',$str,$matches); 
var_dump($matches);
2

'/{theme}(.*?){\/theme}/' ou encore plus restrictive '/{theme}(\w*){\/theme}/' devrait faire le travail

2
preg_match_all('/{theme}(.*?){\/theme}/', $str, $matches); 

Vous devez utiliser Ungreedy correspondant ici. $matches[1] contiendra le contenu de tous les tags correspondants en tant que tableau.

Questions connexes