2015-09-16 4 views
2

Я использую следующий код для соответствия всем буквам, кроме i и d.PHP preg_replace_callback ignore id

/{([abcefghj-z]+)}/ 

Как я могу изменить его так, чтобы я и d может существовать, но не в таком порядке (ID).

Пример строки:

/admin/users/{type}/{id}/edit 

только {тип} бы получить заменить в приведенном выше примере.

Пример 2:

/admin/users/{type}/{id}/{supplied}/edit 

В приведенном выше примере, как {тип} и {} поставляется бы получить согласованы.

Возможно ли это с помощью regex?

UPDATE

код я использую согласно ниже пост является:

$current = 'admin/users/{type}/{id}/changePassword'; 
$parameters = array('type' => 'administrators', 'id' => '1'); 

$path = preg_replace_callback('~\{(?!id\})[a-z]+\}~', function ($m) use ($parameters) { 
     return $parameters[$m[1]]; 
}, $current); 

ответ

1

Вот решение для вас: вам нужно использовать capturing group (таким образом я добавил круглые скобки в ([a-z]+)), чтобы иметь возможность получить значение вам нужно, и я вижу, что вам нужно выполнить поиск в регистронезависимом способом (таким образом, я добавил ~i):

$current = 'admin/users/{type}/{id}/changePassword'; 
$parameters = array('type' => 'administrators', 'id' => '1'); 

$path = preg_replace_callback('~\{(?!id\})([a-z]+)\}~i', function ($m) use ($parameters) { 
//          ^ ^^
     return $parameters[$m[1]]; 
}, $current); 

echo $path; 

См IDEONE demo

С группой захвата $m[1] будет удерживать «тип», и вы получите правильное значение из массива.

0

Используйте условное выражение.

\{(?!id\})[a-z]+\} 
  • (?!id\}) утверждает предыдущий маркер { будет следовать любым, но не id}.
  • Если да, то сопоставьте один или несколько строчных букв, а затем }.

DEMO

Пример:

Это позволит заменить все совпавшие подстроки с {foo}.

preg_replace('~\{(?!id\})[a-z]+\}~', '{foo}', $str); 

DEMO

+0

Когда я использую это регулярное выражение для своей функции выше, я получаю: 'preg_replace_callback(): разделитель не должен быть буквенно-цифровым или обратным слэшем. – V4n1ll4

+0

PLS использует' ~ 'как разделитель регулярных выражений. –

+0

Спасибо, но теперь я получаю 'Undefined offset: 1' – V4n1ll4

Смежные вопросы