2013-02-25 2 views
2

Я хочу заменить некоторые цифры в строке содержимым массива в позиции, на которую указывает это число.Используйте регулярное выражение как указатель массива

Например, заменить "Привет 1 Вы великолепны" с "Hello MyArray [1] Вы великолепны"

я делал следующее: preg_replace('/(\d+)/','VALUE: ' . $array[$1],$string);

Но это не Работа. Как я могу это сделать?

+0

Do фактические случаи использования нужны регулярные выражения? –

+0

Зачем вы это делаете? Похоже, вы строите какую-то систему шаблонов. Это похоже на проблему [xy] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem) – Nanne

+1

Afaik '$ 1' заменяется только на * string *, где он (не уверен, как PHP делает это со своими встроенными переменными). Попробуйте ['preg_replace_callback'] (http://php.net/manual/en/function.preg-replace-callback.php) – Bergi

ответ

6

Вы должны использовать обратный вызов.

<?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, поскольку он предлагает меньше возможностей испортить логику.

+0

Спасибо, вам просто нужно было найти ** идентификатор использования **. http://stackoverflow.com/questions/1065188/in-php-5-3-0-what-is-the-function-use-identifier-should-a-sane-programmer-us –

+0

Отличный ответ, D –

+1

' trim ($ matches [0], '{}'); '- uh? Разве вы не должны использовать соответствующие группы захвата, т. Е. '/ \ {(\ D +) \} /'? – Bergi

0
$string = "Hello 1 you are great"; 
$replacements = array(1 => 'I think'); 

preg_match('/\s(\d)\s/', $string, $matches); 

foreach($matches as $key => $match) { 
    // skip full pattern match 
    if(!$key) { 
    continue; 
    } 
    $string = str_replace($match, $replacements[$match], $string); 
} 
+0

Это теряет большую часть гибкости при использовании регулярного выражения. Что делать, если вы действительно хотели заменить регулярное выражение? –

+0

Хорошая точка. Благодарю. –

0
<?php 
$array = array(2 => '**', 3 => '***'); 
$string = 'lets test for number 2 and see 3 the result'; 
echo preg_replace_callback('/(\d+)/', 'replaceNumber', $string); 

function replaceNumber($matches){ 
global $array; 
return $array[$matches[0]]; 
} 
?> 

выход

lets test for number ** and see *** the result 
2

Другой ответ прекрасно. Мне удалось это так:

$val = "Chris is 0"; 
    // Initialise with index. 
    $adj = array("Fun", "Awesome", "Stupid"); 
    // Create array of replacements. 
    $pattern = '!\d+!'; 
    // Create regular expression. 
    preg_match($pattern, $val, $matches); 
    // Get matches with the regular expression. 
    echo preg_replace($pattern, $adj[$matches[0]], $val); 
    // Replace number with first match found. 

Просто предлагает другое решение проблемы :)

+0

Спасибо, Крис ... это тоже здорово;) Спасибо! –

+0

Я буду использовать другой, потому что не все числа существуют как ключи массива, но спасибо за обмен интеллектом;) –

+1

Это было мое удовольствие :) – christopher

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