Вы должны использовать обратный вызов.
<?php
$str = 'Hello, 1!';
$replacements = array(
1 => 'world'
);
$str = preg_replace_callback('/(\d+)/', function($matches) use($replacements) {
if (array_key_exists($matches[0], $replacements)) {
return $replacements[$matches[0]];
} else {
return $matches[0];
}
}, $str);
var_dump($str); // 'Hello, world!'
Поскольку вы используете функцию обратного вызова, в том случае, если вы действительно хотите использовать номер, вы можете кодировать строки как {1}
или что-то вместо 1
. Вы можете использовать модифицированный шаблон соответствия:
<?php
// added braces to match
$str = 'Hello, {1}!';
$replacements = array(
1 => 'world'
);
// added braces to regex
$str = preg_replace_callback('/\{(\d+)\}/', function($matches) use($replacements) {
if (array_key_exists($matches[1], $replacements)) {
return $replacements[$matches[1]];
} else {
// leave string as-is, with braces
return $matches[0];
}
}, $str);
var_dump($str); // 'Hello, world!'
Однако, если вы всегда соответствующие известные строки, вы можете использовать @ChrisCooney's solution, поскольку он предлагает меньше возможностей испортить логику.
Do фактические случаи использования нужны регулярные выражения? –
Зачем вы это делаете? Похоже, вы строите какую-то систему шаблонов. Это похоже на проблему [xy] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem) – Nanne
Afaik '$ 1' заменяется только на * string *, где он (не уверен, как PHP делает это со своими встроенными переменными). Попробуйте ['preg_replace_callback'] (http://php.net/manual/en/function.preg-replace-callback.php) – Bergi