PHP正则替换函数preg_replace和preg_replace_callback使用总结

PHP正则表达式替换函数preg_replace和preg_replace_callback的使用总结 无论是简单的字符串替换还是基于匹配内容动态生成替换结果,这两个函数都能满足我们的需求。在实际开发中,我们可以根据具体的场景选择合适的替换方式,并结合正则表达式的强大功能,提高代码的灵活性和效率。其中,preg_replace和preg_replace_callback是两个常用的函数,用于在字符串中查找匹配正则表达式模式的内容,并进行替换操作。preg_replace_callback函数与preg_replace类似,不同之处在于替换的内容可以是一个回调函数,而不仅仅是一个字符串。 阅读详情

在编写PHP模板引擎工具类时,以前常用的一个正则替换函数为 preg_replace(),加上正则修饰符 /e,就能够执行强大的回调函数,实现模板引擎编译(其实就是字符串替换)。

详情介绍参考博文:PHP函数preg_replace() 正则替换所有符合条件的字符串

应用举例如下:

复制代码代码如下:

<?php
/**
 * 模板解析类
 */
class Template {

 public function compile($template) {

  // if逻辑
  $template = preg_replace("/\<\!\-\-\{if\s+(.+?)\}\-\-\>/e", "\$this->ifTag('\\1')", $template);

  return $template;
 }

 /**
  * if 标签
  */
 protected function ifTag($str) {

  //$str = stripslashes($str); // 去反转义

  return '<?php if (' . $str . ') { ?>';
 }
}

$template = 'xxx<!--{if $user[\'userName\']}-->yyy<!--{if $user["password"]}-->zzz';

$tplComplier = new Template();

$template = $tplComplier->compile($template);

echo $template;

?>

输出结果为:

复制代码代码如下:

xxx<?php if ($user['userName']) { ?>yyy<?php if ($user[\"password\"]) { ?>zzz

仔细观察,发现 $user["password"] 中的双引号被转义了,这不是我们想要的结果。

为了能够正常输出,还必须反转义一下,但是,如果字符串中本身含有反转义双引号的话,我们此时反转义,原本的反转义就变成了非反转义了,这个结果又不是我们想要的,所以说这个函数在这方面用的不爽!

后来,发现一个更专业级的 正则替换回调函数 preg_replace_callback()。

复制代码代码如下:

mixed preg_replace_callback ( mixed pattern, callback callback, mixed subject [, int limit] )
本函数的行为几乎和 preg_replace() 一样,除了不是提供一个 replacement 参数,而是指定一个 callback 函数。该函数将以目标字符串中的匹配数组作为输入参数,并返回用于替换的字符串。

回调函数 callback:

一个回调函数,在每次需要替换时调用,调用时函数得到的参数是从subject 中匹配到的结果。回调函数返回真正参与替换的字符串。这是该回调函数的签名:

复制代码代码如下:

string handler ( array $matches )

像上面所看到的,回调函数通常只有一个参数,且是数组类型。

罗列一些有关preg_replace_callback()函数的实例:

Example #1 preg_replace_callback() 和 匿名函数

复制代码代码如下:

<?php
/* 一个unix样式的命令行过滤器,用于将段落开始部分的大写字母转换为小写。 */
$fp = fopen("php://stdin", "r") or die("can't read stdin");
while (!feof($fp)) {
    $line = fgets($fp);
    $line = preg_replace_callback(
        '|<p>\s*\w|',
        function ($matches) {
            return strtolower($matches[0]);
        },
        $line
    );
    echo $line;
}
fclose($fp);
?>

如果回调函数是个匿名函数,在PHP5.3中,通过关键字use,支持给匿名函数传多个参数,如下所示:

复制代码代码如下:

<?php 
$string = "Some numbers: one: 1; two: 2; three: 3 end"; 
$ten = 10; 
$newstring = preg_replace_callback( 
    '/(\\d+)/', 
    function($match) use ($ten) { return (($match[0] + $ten)); }, 
    $string 
    ); 
echo $newstring; 
#prints "Some numbers: one: 11; two: 12; three: 13 end"; 
?>

Example #2 preg_replace_callback() 和 一般函数

复制代码代码如下:

<?php
// 将文本中的年份增加一年.
$text = "April fools day is 04/01/2002\n";
$text.= "Last christmas was 12/24/2001\n";
// 回调函数
function next_year($matches) {
  // 通常: $matches[0]是完成的匹配
  // $matches[1]是第一个捕获子组的匹配
  // 以此类推
  return $matches[1].($matches[2]+1);
}
echo preg_replace_callback(
            "|(\d{2}/\d{2}/)(\d{4})|",
            "next_year",
            $text);

?>

Example #3 preg_replace_callback() 和 类方法

如何在类的内部调用非静态函数?你可以按如下操作:
对于 PHP 5.2,第二个参数 像这样 array($this, 'replace') :

复制代码代码如下:

<?php
class test_preg_callback{

  private function process($text){
    $reg = "/\{([0-9a-zA-Z\- ]+)\:([0-9a-zA-Z\- ]+):?\}/";
    return preg_replace_callback($reg, array($this, 'replace'), $text);
  }
  
  private function replace($matches){
    if (method_exists($this, $matches[1])){
      return @$this->$matches[1]($matches[2]);     
    }
  }  
}
?>

对于 PHP5.3,第二个参数像这样 "self::replace" :
注意,也可以是 array($this, 'replace')。

复制代码代码如下:

<?php
class test_preg_callback{

  private function process($text){
    $reg = "/\{([0-9a-zA-Z\- ]+)\:([0-9a-zA-Z\- ]+):?\}/";
    return preg_replace_callback($reg, "self::replace", $text);
  }
  
  private function replace($matches){
    if (method_exists($this, $matches[1])){
      return @$this->$matches[1]($matches[2]);     
    }
  }  
}
?>


根据上面所学到的知识点,把模板引擎类改造如下:

复制代码代码如下:

<?php
/**
 * 模板解析类
 */
class Template {

 public function compile($template) {

  // if逻辑
  $template = preg_replace_callback("/\<\!\-\-\{if\s+(.+?)\}\-\-\>/", array($this, 'ifTag'), $template);

  return $template;
 }

 /**
  * if 标签
  */
 protected function ifTag($matches) {
  return '<?php if (' . $matches[1] . ') { ?>';
 }
}

$template = 'xxx<!--{if $user[\'userName\']}-->yyy<!--{if $user["password"]}-->zzz';

$tplComplier = new Template();

$template = $tplComplier->compile($template);

echo $template;

?>

输出结果为:

复制代码代码如下:

xxx<?php if ($user['userName']) { ?>yyy<?php if ($user["password"]) { ?>zzz

正是我们想要的结果,双引号没有被反转义!

PS:关于正则,本站还提供了2款非常简便实用的正则表达式工具供大家使用:

JavaScript正则表达式在线测试工具:
http://tools.jb51.net/regex/javascript

正则表达式在线生成工具:
http://tools.jb51.net/regex/create_reg

ecmall 解决php5.6升级后的所有bug preg_replace_callback() 解决了ecmall php版本升级后,模板编辑,验证码不出来,preg_replace_callback() 函数替换 的方法 立即下载

相关推荐

php中preg_replace_callback函数简单用法示例

本文实例讲述了php中preg_replace_callback函数用法。分享给大家供大家参考,具体如下: mixed preg_replace_callback ( mixed pattern, callback callback, mixed subject [, int limit] ) 本函数的行为几乎和 preg_replace() 一样,除了不是提供一个 replacement 参数,而是指定一个 callback 函数。该函数将以目标字符串中的匹配数组作为输入参数,并返回用于替换的字符串。 例如问题: preg_replace($skx,$imsz2,$neirong); 如

preg_replace与preg_replace_callback

// preg_replace // 删除空格 $str = 'runo o b'; $str = preg_replace('/\s+/', '', $str); // 将会改变为'runoob' echo $str; // preg_replace_callback // 将文本中的年份增加一年. $text = "April fools day is 04/01/2002\n"; $text.= "Last christmas was 12/24/2001\n"; // 回调函数 functi.

weixin_38230961的博客 403

光耦合MOSFET(Optocoupled MOSFET,简称OCMOS)

光耦合MOSFET(Optocoupled MOSFET,简称OCMOS)是一种将光电耦合器和MOSFET结合在一起的器件,用于实现电气隔离和信号传输。选择合适的光耦合MOSFET时,还需要考虑具体应用的需求和环境条件,以确保最佳性能和可靠性。- 最大输出电流和电压:确保所选型号能够满足电路的最大电流和电压需求。- 最大输出电流和电压:确保所选型号能够满足电路的最大电流和电压需求。- 隔离电压:根据应用环境的电气隔离要求选择合适的隔离电压。- 隔离电压:根据应用环境的电气隔离要求选择合适的隔离电压。

eydj2008的专栏 1725

PHP函数:preg_replace()和preg_replace_callback() 【详记】

本文详细介绍了PHP的函数preg_replace()和preg_replace_callback() 【详记】

2302_79596028的博客 3010

从零上手:基于RK3588平台的RKISP Tuner实战配置与核心功能解析

本文详细介绍了在RK3588平台上使用RKISP Tuner工具进行图像信号处理器(ISP)调试的完整实战流程。从MATLAB运行时环境搭建、服务端部署到核心连接,逐步解析如何通过图形化界面实时调节白平衡、锐化、降噪等参数以优化图像质量。文章重点阐述了实时预览、参数调试、抓图对比及参数保存等核心功能,为开发智能摄像头、机器人等AIoT设备的工程师提供了实用的配置指南与进阶技巧。

js777的博客 631

汽车底盘技术解析:从悬架调校到智能化,如何评价国产车底盘实力

汽车底盘作为决定车辆驾驶质感、安全性和耐久性的核心系统,其技术内涵远不止于悬架结构。从行驶系、转向系到制动系的协同工作,底盘调校是一门融合机械原理与工程实践的艺术。在电动化与智能化浪潮下,底盘技术正经历从被动适应到主动响应的变革,CDC可变阻尼减震器和空气悬架等技术的应用,让底盘具备了通过OTA升级实现性能优化的可能。国产汽车品牌如奇瑞、吉利等,通过平台化架构研发与调校经验积累,正推动底盘技术从“能用”向“好用”乃至“塑造独特驾驶风格”迈进。理解底盘技术,需超越简单的结构对比,关注其在实际路况中的滤震性、支

weixin_34413103的博客 387

php5.6 preg_replace,php5.5 preg_replace_callback 函数

升级了Mac新系统Yosemite,用着非常舒服,不过每次Mac系统更新,php和apache都要重新折腾一下,这次php的版本从5.4更新到5.5。。。工作中对一些开源php软件进行二次开发,升级以后软件报错:preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead在网上查找原因,函数preg...

weixin_34803738的博客 384

uniapp实现app版本发现新版本后,自动更新

app实现自动更新

oldolder的博客 1283

php正则替换br,PHP正则替换函数preg_replace和preg_replace_callback使用总结

在编写PHP模板引擎工具类时,以前常用的一个正则替换函数为 preg_replace(),加上正则修饰符 /e,就能够执行强大的回调函数,实现模板引擎编译(其实就是字符串替换)。详情介绍参考博文:PHP函数preg_replace() 正则替换所有符合条件的字符串应用举例如下:复制代码 代码如下:/*** 模板解析类*/class Template {public function compile...

weixin_39849387的博客 359

Python数据分析实战:用TIGRAMITE库5步搞定时间序列因果分析(附完整代码)

本文详细介绍了如何使用TIGRAMITE库进行时间序列因果分析,通过5个步骤从环境配置到模型优化,帮助读者掌握因果关系库的应用。附完整代码示例,适合数据分析师和研究人员快速实现复杂时间序列的因果发现。

weixin_29050271的博客 160

论文必备 - YOLOv13热力图可视化,支持指定模型,指定显示层,设置置信度,以及10种可视化实现方式

本文带来的是YOLOv13热力图可视化功能,支持,以及。我们经常看到一些论文里绘制了不同的热力图,一方面能够直观的感受其模型的有效性,另一方面也丰富了论文内容。特别是在使用了注意力模块的网络中,热力图就可以验证注意力机制是否真正聚焦到了预期的重要特征上,以便对模型的有效性和合理性进行评估。例如这篇文章中展示的,就很能够表达作者改进后的模型相比之前模型的优越性。

Limiiiing的博客 488

PHP模板引擎正则替换函数 preg_replace 与 preg_replace_callback 使用总结

https://www.cnblogs.com/52php/p/5675463.html

m0_37477061的博客 466

【异常】OpenClaw 连接异常This site can‘t be reached 127.0.0.1 refused to connect Try: Checking the proxy

在访问OpenClaw相关服务时,浏览器提示如下异常信息,无法正常加载页面:Try:补充说明:该报错仅出现于本地访问场景(127.0.0.1为本地回环地址),涉及OpenClaw核心服务的本地连接交互,无外部网络及敏感信息泄露风险。

奶爸的编程之路,也就一周冷个三天 1484

php正则替换%3cbr%3e_PHP正则替换函数preg_replace和preg_replace_callback使用总结

在编写PHP模板引擎工具类时,以前常用的一个正则替换函数为 preg_replace(),加上正则修饰符 /e,就能够执行强大的回调函数,实现模板引擎编译(其实就是字符串替换)。应用举例如下:/*** 模板解析类*/class Template {public function compile($template) {// if逻辑$template = preg_replace("/\/e", ...

weixin_39809793的博客 170

【数据集】1980-2020年(5年)土地利用分类数据-中国科学院

简介1980-2020年每五年土地利用数据-中国科学院

WW、forever的博客 3933

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

php取正则替换模式,php正则替换回调函数preg_replace_callback()初解

php正则中有一个回调函数,本函数的行为几乎和 preg_replace() 一样,除了不是提供一个 replacement 参数,而是指定一个 callback 函数。该函数将以目标字符串中的匹配数组作为输入参数,并返回用于替换的字符串。也就是说mixed preg_replace_callback ( mixed pattern, callback callback, mixed subjec...

weixin_28807529的博客 371

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

php正则替换函数的整理

1、preg_filter函数用于执行一个正则表达式搜索和替换。 preg_filter()等价于preg_replace(),但它仅仅返回与目标匹配的结果。 语法 mixedpreg_filter(mixed$pattern,mixed$replacement,mixed$subject[,int$limit=-1[,int&$count]]) 参数说明 $pattern:要搜索的模式。可以是一个字符串或字符串数组。 $repla...

积善之家 965

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

代码内查找函数引用_PHP正则表达式核心技术完全详解 第5节 php正则替换函数

作者:极客小俊 一个专注于web技术的80后我不用拼过聪明人,我只需要拼过那些懒人 我就一定会超越大部分人!知乎@极客小俊,官方首发原创文章Bilibili: 极客小俊GeekerJun说到替换呢 这里我觉得首先要回忆一下字符串的相关替换函数!str_replace() 在字符串中查找字符,然后替换成想要的字符 str_ireplace() 在字符串中查找字符,然后替换成想要的字符 (不区...

weixin_36299482的博客 172

php正则替换%3cbr%3e_PHP正则表达式核心技术完全详解 第5节 php正则替换函数

极客小俊一个专注于web技术的80后你不用拼过聪明人,你只需要拼过那些懒人 你就一定会超越大部分人!说到替换呢 这里我觉得首先要回忆一下字符串的相关替换函数!str_replace() 在字符串中查找字符,然后替换成想要的字符 str_ireplace() 在字符串中查找字符,然后替换成想要的字符 (不区分大小写) 小提示 str_replace() 函数是全局替换练习: 在字符串中查找数组...

weixin_28756347的博客 292

PHP使用正则表达式查找替换字符串

1.preg_match— 执行一个正则表达式匹配 int preg_match ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] ) 搜索subject与pattern给定的正则表达式的一个匹配. patte...

dichen3237的博客 666

pregreplacecallback php,php正则preg_replace_callback函数用法实例

本文实例讲述了php正则preg_replace_callback函数的用法。分享给大家供大家参考。具体实现方法如下:php正则表达式功能强大,本范例演示了preg_replace_callback函数的用法// Define a dummy text, for testing...$Text = "Title: Hello world!\n";$Text .= "Author: Jonas\n"...

weixin_28750421的博客 449
上一篇: 讲解一下ThinkPHP的关联模型
下一篇: 记录thinkphp3.13移植到php7过程
Lankecms
博客等级 码龄15年 14粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值