preg_replace()替换成preg_replace_callback() php5.5之后

来源:互联网 发布:阿里云dns解析故障 编辑:程序博客网 时间:2024/06/01 23:12

由于php5.5之后,/e修饰符被丢弃。


$str = preg_replace("/<\?php([^\?]+)\?>/es", "template_addquote('<?php\\1?>')", $str);
改成  
$str =  preg_replace_callback("/<\?php([^\?]+)\?>/", function($r) { return template_addquote("<?php$r[1]?>");}, $str);


    $template = preg_replace("/\<\?php echo \<\?php echo $var_regexp; \?\>; \?\>/es", "addquote('<?php echo \\1; ?>')", $template);

改成
    $template = preg_replace_callback("/\<\?php echo \<\?php echo $var_regexp; \?\>; \?\>/s", function($r){ return addquote("<?php echo $r[1]; ?>");}, $template);

修饰符/e /s说明
e (PREG_REPLACE_EVAL)
如果这个修饰符设置了, preg_replace()在进行了对替换字符串的 后向引用替换之后, 将替换后的字符串作为php代码评估执行(eval函数方式), 并使用执行结果 作为实际参与替换的字符串. 单引号, 双引号, 反斜线(\)和NULL字符在 后向引用替换时会被用反斜线转义.

s (PCRE_DOTALL)
如果设置了这个修饰符, 模式中的点号元字符匹配所有字符, 包含换行符. 如果没有这个 修饰符, 点号不匹配换行符. 这个修饰符等同于perl中的/s修饰符. 一个取反字符类比如 [^a]总是匹配换行符, 而不依赖于这个修饰符的设置.

阅读全文
0 0