2

我想用这个数字指向的位置的数组内容替换字符串中的一些数字。

例如,将"Hello 1 you are great"替换为"Hello myarray[1] you are great"

我正在做下一个:preg_replace('/(\d+)/','VALUE: ' . $array[$1],$string);

但它不起作用。我怎么能做到?

4

4 回答 4

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}or 而不是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 的解决方案,因为它提供的搞砸逻辑的机会较少。

于 2013-02-25T15:37:29.270 回答
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.

只是为问题提供另一种解决方案:)

于 2013-02-25T15:48:37.077 回答
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);
}
于 2013-02-25T15:48:00.660 回答
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
于 2013-02-25T15:48:17.207 回答