Возникли проблемы с Regex - PullRequest
1 голос
/ 23 июля 2010

Хорошо, у меня есть это:

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

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

То, что должно быть сделано, соответствует всем [color = to.

Я запускаю это, но вот что выводит источник:

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

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

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

через него.

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

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

Спасибо:)

** На случай, если у кого-то НЕТ ИДЕИ, что я хочу с этим сделать (это довольно неясно :), вот оно:

Перевести [color = red] на <span style="color:red;"> Перевести [/ color] на </span>.

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

Ответы [ 2 ]

4 голосов
/ 23 июля 2010

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

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

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

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

0 голосов
/ 23 июля 2010

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

$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);
...