已掉线,重新登录

首页 > 绿虎论坛 > 历史版块 > 编程 > PHP > 讨论/求助

标题: preg replace求助

作者: @Ta

时间: 2013-07-19

点击: 1633

<?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|隐藏机器人聊天)』

1. @王鸿杰,答案很简单,就是你把函数的执行顺序搞错了: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 14:27//)

2. @老虎会游泳 谢谢虎哥,有点小明白了,试试
(/@Ta/2013-07-19 15:01//)

回复需要登录

8月14日 04:26 星期四

本站由hu60wap6驱动

备案号: 京ICP备18041936号-1