Как исправить проблему замены Preg с помощью escape-символа - PullRequest
1 голос
/ 01 апреля 2019

Я использую функцию preg_replace для получения URL-адреса перенаправления. Но он не заменяет должным образом.

Я пытаюсь описать код ниже

$key = 'acme/(.*)/(.*)';
$val = '\Acme\Blog\Controllers\$1::$2';
$uri = 'acme/Home/hello1';
$redirect = preg_replace('#^' . $key . '$#', $val, $uri);

Ожидаемый результат -

\Acme\Blog\Controllers\Home::hello1 

, но получается результат

\Acme\Blog\Controllers$1::hello1

Ответы [ 2 ]

0 голосов
/ 01 апреля 2019

Все обратные слеши в вашем шаблоне должны быть удвоены, потому что обратный слеш в шаблоне замены считается специальным символом: он экранирует знаки доллара, поэтому, если число идет после \$, оно не может быть проанализировано как обратная ссылка.

Итак, все, что вам нужно, это

preg_replace('#^' . $key . '$#', str_replace('\\', '\\\\', $val), $uri)

См. PHP демо :

$key = 'acme/(.*)/(.*)';
$val = '\Acme\Blog\Controllers\$1::$2';
$uri = 'acme/Home/hello1';
$redirect = preg_replace('#^' . $key . '$#', str_replace('\\', '\\\\', $val), $uri);
echo $redirect;

Ouput:

\Acme\Blog\Controllers\Home::hello1
0 голосов
/ 01 апреля 2019

использовать preg_quote ()

Код:

$key = 'acme/(.*)/(.*)';

$val = preg_quote('\\Acme\\Blog\\Controllers\\') . '$1::$2';
$uri = 'acme/Home/hello1';
$redirect = preg_replace('#^' . $key . '$#', $val, $uri);

echo $redirect;

Результат:

\Acme\Blog\Controllers\Home::hello1

Примечание:

Это недопустимый путь:

'\Acme\Blog\Controllers\$1::$2';

Поскольку обратную косую черту \ необходимо экранировать с другой обратной косой чертой \, это на уровне строки. Если вы хотите создать строку, содержащую одну обратную косую черту, вам нужно поместить две из них.

$singleBackslash = '\\';

, поскольку обратная косая черта обрабатывается как escape-код, это даст вам ошибку разбора:

$singleBackslash = '\';

потому что обратный слеш избежал окончания '

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

...