Я использую следующий код для соответствия всем буквам, кроме i и d .
/{([abcefghj-z]+)}/
Как я могу изменить его так, чтобы i и d могли существовать, но не в этом порядке (id).
Примеры строк:
/admin/users/{type}/{id}/edit
В приведенном выше примере заменяется только {type}.
Пример 2:
/admin/users/{type}/{id}/{supplied}/edit
В приведенном выше примере оба типа {type} и {provided} будут совпадать.
Возможно ли использование регулярного выражения?
ОБНОВИТЬ
Код, который я использую в соответствии с нижеприведенным сообщением:
$current = 'admin/users/{type}/{id}/changePassword'; $parameters = array('type' => 'administrators', 'id' => '1'); $path = preg_replace_callback('~\{(?!id\})[az]+\}~', function ($m) use ($parameters) { return $parameters[$m[1]]; }, $current);
Вот вам решение: вам нужно использовать группу захвата (таким образом, я добавил круглые скобки в ([az]+)
), чтобы получить нужное значение, и я вижу, что вам нужно выполнить поиск в case- (таким образом, я добавил ~i
):
$current = 'admin/users/{type}/{id}/changePassword'; $parameters = array('type' => 'administrators', 'id' => '1'); $path = preg_replace_callback('~\{(?!id\})([az]+)\}~i', function ($m) use ($parameters) { // ^ ^ ^ return $parameters[$m[1]]; }, $current); echo $path;
См. Демонстрацию IDEONE
При захвате группы $m[1]
будет удерживать «тип», и вы получите правильное значение из массива.
Используйте отрицательное утверждение.
\{(?!id\})[az]+\}
(?!id\})
утверждает предыдущий токен {
за ним следует любое, но не id}
. }
. DEMO
Пример:
Это заменит все согласованные подстроки {foo}
.
preg_replace('~\{(?!id\})[az]+\}~', '{foo}', $str);
DEMO