Какое регулярное выражение я должен использовать? - PullRequest
2 голосов
/ 27 октября 2009

Я пишу приложение на PHP, и мне нужно заменить любое слово между <!-- * и * --> его соответствующим элементом в $vars. Например,

<!-- *foobar* -->

В этом случае 'foobar' должен быть заменен значением переменной $vars["foobar"]. Вот что у меня сейчас, но не работает (всегда возвращает <> :():

preg_replace_callback("<!--(\s+)\*([a-zA-Z0-9]+)\*(\s+)-->", create_function('$matches', 'return $vars[$matches];'), $template);

Кто-нибудь может мне помочь? Заранее спасибо.

Ответы [ 3 ]

4 голосов
/ 27 октября 2009

Помните, что вы не можете использовать $ vars, не вводя at с глобальным ключевым словом или не используя $ GLOBALS. Также, если вы используете PHP 5.3, вы можете использовать анонимную функцию без уродливого глобального взлома:

$template = preg_replace_callback('/<!--\s+\*(\w+)\*\s+-->/', function($matches) use ($vars) { return $vars[$matches[1]]; }, $template);

В pre-5.3 вы можете сделать это:

$template = preg_replace_callback('/<!--\s+\*(\w+)\*\s+-->/', create_function('$matches', 'return $GLOBALS["vars"][$matches[1]];'), $template);

Если вы не запускаете 5.3, но по-прежнему хотите избежать глобальной переменной, вы можете сделать это:

$template = preg_replace('/<!--\s+\*(\w+)\*\s+-->/e', '$vars["\1"]', $template);
1 голос
/ 27 октября 2009

Попробуйте:

create_function('$matches', 'return $vars[$matches[2]];')

поскольку вторая группа - это та, которую вы хотите. Не уверен, почему вы захватываете других, однако. Также для такого рода вещей я предпочитаю глобальный, а не звонить create_function().

Кроме того, вы не ограничиваете регулярное выражение, как эта версия с /:

$vars = array(...);
preg_replace_callback('/<!--\s+\*([a-zA-Z0-9]+)\*\s+-->/', 'replace_var', $template);

function replace_var($matches) {
  global $vars;
  return $vars[$matches[1]];
}
0 голосов
/ 27 октября 2009

Я думаю, что вам нужно:

preg_replace_callback("/<!--\s+\*([a-zA-Z0-9]+)\*\s+-->/", create_function('$matches', 'return $vars[$matches[2]];'), $template);

Переменная $ match является массивом. Индекс 0 - это то, что соответствует всему регулярному выражению, а затем любые другие индексы - это группы захвата (если таковые имеются) в регулярном выражении.

В этом случае $ match будет выглядеть так:

array(2) {
  [0]=>
  string(18) "<!-- *example* -->"
  [1]=>
  string(7) "example"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...