4

如何c(xxx)c(xxx)in替换preg_replace

在下面的代码中,我想str c(xxx)functioun c(xxx).
我没有得到我想要的正确结果。
我的代码有什么问题?以及如何解决?

$c['GOOD']='very good';
$c['BOY']='jimmy';
function c($x){
    global $c;
    if(isset($c[$x])){
        return $c[$x];
    }
}

$str="hello c(GOOD) world c(BOY) ";
$str=preg_replace("@c\(([A-Z_\d]+)\)@",c('$1'),$str);
echo $str;  // --> hello  world

// how to get hello very good world jimmy
4

3 回答 3

3

php.net: preg_replace_callback()

如果您查看示例 #2,这就是您要查找的内容:)

function c($matches){
   print_r($matches)
}
$str = preg_replace_callback("@c\(([A-Z_\d]+)\)@", 'c', $str);

小旁注:我不知道你是否想调用你的函数'c',但我建议使用明确的函数名来解释它们的作用

于 2013-07-25T08:38:14.093 回答
2

尝试e修饰符http://php.net/manual/en/reference.pcre.pattern.modifiers.php

注意:此功能自 PHP 5.5.0 起已弃用。强烈建议不要依赖此功能。

<?php
  $str  = preg_replace( "/c\(([A-Z_\d]+)\)/e", 'c("$1")', $str );
?>

更好的使用preg_replace_callback

<?php
  $str  = preg_replace_callback( "/c\(([A-Z_\d]+)\)/", function( $m ) {
    return c( $m[1] );
  }, $str );
?>
于 2013-07-25T08:36:53.830 回答
0

您可以将 preg_replace_callback 与匿名函数一起使用

<?php
$c['GOOD']='very good';
$c['BOY']='jimmy';

$str="hello c(GOOD) world c(BOY) ";
  echo preg_replace_callback('@c\((.*?)\)@', function ($match) use ($c) { 
   if (isset($c[$match[1]])) return $c[$match[1]]; 
  }, 
  $str);
?>

这个函数的优点是:它允许你传递第二个参数see use ($c)。然后无需创建第二个功能。

于 2013-07-25T08:55:18.943 回答