2010-02-09 7 views
2

Je suis en train de venir = avec une chaîne regex à utiliser avec les fonctions preg PHP (de preg_match, etc.) et je suis perplexe sur ce point:PHP Regex pour saisir {tag} quelque chose {/ tag}

Comment faire correspondre cette chaîne?:

{area-1}some text and maybe a <a href="http://google.com">link</a>.{/area-1} 

Je veux le remplacer par une chaîne différente en utilisant preg_replace.

Jusqu'à présent, je suis en mesure d'identifier la première balise avec preg_match comme ceci:

preg_match("/\{(area-[0-9]*)\}/", $mystring); 

Merci si vous pouvez aider!

+0

@Mike B: Ce n'est pas du HTML. – Gumbo

+0

@Gumbo Très vrai, j'annule mon commentaire. –

Répondre

4

Si vous ne disposez pas de balises imbriquées, quelque chose ce simple devrait fonctionner:

preg_match_all("~{.+?}(.*?){/.+?}~", $mystring, $matches); 

Vos résultats peuvent alors être trouvés dans $matches[1].

+0

Que fait le caractère '~' dans ce contexte? – donut

+4

@donut Délimiteurs de motif indiquant le début et la fin du motif. Ils peuvent être remplacés par (afaik) presque n'importe quelle paire de caractères. La barre oblique est couramment utilisée. –

+0

La barre oblique est commune mais peu pratique si la regex elle-même contient des barres obliques. Dans ce cas, les barres obliques doivent être échappées, l'utilisation de caractères différents évite cela. –

0

Je suggère

preg_match_all("~\{(area-[0-9]*)\}(.*?)\{/\1\}~s", $mystring, $matches); 

Cela même fonctionner si d'autres balises sont imbriquées dans la balise area que vous regardez.

Si plusieurs balises area sont imbriquées l'une dans l'autre, cela fonctionnera toujours, mais vous devrez appliquer l'expression régulière plusieurs fois (une fois pour chaque niveau d'imbrication).

Et bien sûr, le contenu des correspondances sera en $matches[2], pas $matches[1] comme dans la réponse de Tatu.

+1

Vous n'avez pas besoin d'échapper' {'et'} ', ils sont interprétés comme des caractères littéraux sauf s'ils font partie d'un jeton valide (par exemple {n}). :) –

+0

Je le pensais aussi, mais RegexBuddy avait inséré les barres obliques inversées pour moi, alors je suis allé avec. Je regarderai plus loin. –

+0

Merci pour votre aide les gars. Je vais essayer. – Aaron