2010-07-23 2 views
1

Ok, так что у меня есть это:Имея некоторые проблемы с Regex

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

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

Что, что он должен делать это соответствовать всем [цвет = к.

Я бегу, но это то, что выходы источника:

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

Когда я пытаюсь запустить

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

через него.

Что происходит? Я не очень хорошо знаю Regex, это мое первое Regex. Но я просто не могу понять, почему он создает что некрасиво исходный код, который не работает :(

Кто-нибудь знает?

Спасибо :)

** В случае, если кто не знает, что я хочу делать с этим (это довольно неясно :), вот это:

Перевести [цвет = красный] в <span style="color:red;"> Перевести [/ color] для </span>.

Теперь мне нужно сделать это отдельно, если я их как один шаблон регулярных выражений это будет бардак с другой проблемой, которая займет несколько дней, чтобы объяснить: \

ответ

4

Использование не-жадные кванторы:

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

то, что происходит в том, что ваше регулярное выражение для начального тега фактически уплетая открывающий тег, материал в середине, и конца тег, потому что .+ жаден и соответствует столько, сколько он может, так \] фактически соответствовал скобке в конце близко бирка.

Нежелательная версия, .+?, подходит как можно меньше, сохраняя при этом регулярное выражение, и, следовательно, будет соответствовать только тегу open.

+0

Вау, спасибо! Ты спасатель;) – Scott

0

Учитывая ответ Эмбер, вы также можете запустить его в одной строке/матч, как это:

$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); 
Смежные вопросы