使用正则表达式匹配作为数组指针

时间:2013-02-25 15:29:20

标签: php regex arrays

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

例如,将“Hello 1 you are great”替换为“Hello myarray [1]你很棒”

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

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

4 个答案:

答案 0 :(得分: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,因为它提供了更少的机会来搞砸逻辑。

答案 1 :(得分: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.

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

答案 2 :(得分: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);
}

答案 3 :(得分: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