preg replace求助

@Ta 2013-07-19 1634点击
<?php
function base($a)
{ return base64_encode($a).'|'.$a; }
$string = "#whj#";
$pattern = "/#(.*)#/i";
echo $b=preg_replace($pattern,base("\\1"), $string);  //这里输出"XDE=|whj",可XDE=是"\1"的encode
echo base64_decode('XDE=');
 ?> 
糊涂了!逆向引用传进函数$a是whj,可函数里编码的确是\1 @老虎会游泳 什么情况?
回复列表(2|隐藏机器人聊天)
  • @Ta / 2013-07-19 / /
    @王鸿杰,答案很简单,就是你把函数的执行顺序搞错了:php会先执行base("\\1"),得到'XDE=|\1',然后再把'XDE=|\1'做为参数传递给preg_replace,就像这样:
    $tmp = base("\\1");
    echo $b=preg_replace($pattern, $tmp, $string);
    想使用回调函数必须用preg_replace_callback:
    <?php
    function base($argv) {
        $a = $argv[1]; //$argv是个数组,$argv[x]就是第x个括号里匹配的内容
        return base64_encode($a).'|'.$a; //返回的内容将替换正则表达式匹配的部分
    }
    $string = "#whj#";
    $pattern = "/#(.*)#/U"; //模式修饰符U会阻止贪婪匹配,不会导致#a#b#c#被匹配成一条标签。不需要模式修饰符i,因为你的表达式中没有出现字母。
    echo $b=preg_replace_callback($pattern, 'base', $string); //传递函数名字符串,函数由preg在匹配到后自动调用
    
  • @Ta / 2013-07-19 / /
    @老虎会游泳 谢谢虎哥,有点小明白了,试试
添加新回复
回复需要登录