2010-07-23 9 views
1

Ok, donc je ceci:Ayant des problèmes avec Regex

$fromArray = array(
"/(\[color=)(.+)(\])/", 
"(\[\/color\])"); 

$toArray = array(
"<span style=\"color:\\2\">", 
"</span>"); 

Qu'est-ce qui est censé le faire correspondre à tous [color = à.

Je suis en cours d'exécution, mais c'est ce que les sorties de source:

<span style="color:red]RED<b>BOLD</b>RED[/color"> 

Lorsque je tente de lancer

[color=red]RED[b]BOLD[/b]RED[/color] 

à travers elle.

Que se passe-t-il? Je ne connais pas très bien Regex, c'est mon premier Regex. Mais je ne peux pas comprendre pourquoi il est la création de ce code source laid qui ne fonctionne pas :(

Quelqu'un sait-il?

Merci :)

** Dans le cas où quelqu'un n'a aucune idée ce que je veux faire avec ça (il est assez clair :), voici ce:

Traduisez [color = red] pour <span style="color:red;"> Traduisez [/ color] à </span>.

Maintenant, je dois faire ces séparément, si je les fais comme un motif de regex ça va gâcher avec une autre question qui prendrait des jours pour expliquer: \

Répondre

4

Utilisez le quantificateur non gourmand:

$fromArray = array(
"/(\[color=)(.+?)(\])/", 
"(\[\/color\])"); 

ce qui se passe est que votre regex pour la balise de départ était en fait engloutit la balise de début, les choses au milieu, et la balise de fin, car .+ est avide et correspond autant que possible, de sorte que le \] était en fait correspondre le support à la fin de la fermer tag.

La version non gourmande, .+?, correspond le moins possible tout en permettant à l'expression régulière de correspondre, et s'assurera ainsi de ne faire correspondre que l'étiquette ouverte.

+0

Wow, merci! Vous êtes un sauveteur;) – Scott

0

Prise en réponse d'Amber, vous pouvez également exécuter une seule ligne/match comme celui-ci:

$subject = '[color=red]RED[b]BOLD[/b]RED[/color]'; 
$result = preg_replace('%\[color=([#a-g0-9]+)\](.+?)\[/color\]%im', '<span style="color:$1">$2</span>', $subject); 
Questions connexes