首页 后端开发 php教程 关于字符串替换及 preg_replace 函数的后向引用_PHP教程

关于字符串替换及 preg_replace 函数的后向引用_PHP教程

Jul 21, 2016 pm 02:58 PM
php replace 关于 函数 字符串 引用 替换

在 PHP 里面替换字符串有很多种方法,str_replace 是再常见不过了,复杂一点的也可能会用到 preg_replace 方法。

这两个方法(str_replace 和 preg_replace)除了正则外,在循环替换的问题上也有一个恶心的差异。先看看各自的语法说明:

str_replace

mixed str_replace ( mixed $search , mixed $replace , mixed $subject [, int &$count ] )
preg_replace

mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )
很明显在可选的参数列表中,preg_replace 多了个 limit 项,这个 limit 项控制了字符串替换操作的次数。

那么问题来了,现在需要实现如下一个需求,将下列代码中的两个 {module} 分别替换成不同的字符串:



{module}


{module}


如果用 str_replace 方法,一次替换操作无法实现只替换一个 {module} 字符串。
如果用 preg_replace 方法,发现这个会造成个要命的 bug,比如下面这段代码:


$replace = '$12.34';
$subject = 'Pay {replace} for it.';
echo preg_replace('/\{replace\}/', $replace, $subject);

?>
输出的结果是:

Pay .34 for it.
而不是期望的:

Pay $12.34 for it.
究其原因,是因为 preg_replace 的第二参数存在后向引用的问题:

replacement中可以包含后向引用\\n 或(php 4.0.4以上可用)$n,语法上首选后者。 每个 这样的引用将被匹配到的第n个捕获子组捕获到的文本替换。 n 可以是0-99,\\0和$0代表完整的模式匹配文本。 捕获子组的序号计数方式为:代表捕获子组的左括号从左到右, 从1开始数。如果要在replacement 中使用反斜线,必须使用4个(“\\\\”,译注:因为这首先是php的字符串,经过转义后,是两个,再经过 正则表达式引擎后才被认为是一个原文反斜线)。

要避免这个问题,有两个解决方案:

第一种,$ 符号使用实体字符($),避免造成和 PHP 语言的冲突。
第二种,使用 strpos 结合 substr_replace 的方法。例如:

$start = strpos($str, '{module}');
$str = substr_replace($str, 'http://www.mangguo.org', $start, sizeof('{module}'));
参考资料:
[1] http://php.net/manual/zh/function.str-replace.php
[2] http://php.net/manual/zh/function.preg-replace.php

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/363791.htmlTechArticle在 PHP 里面替换字符串有很多种方法,str_replace 是再常见不过了,复杂一点的也可能会用到 preg_replace 方法。 这两个方法(str_replace 和 pre...
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前 By 尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
4 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

CakePHP 项目配置 CakePHP 项目配置 Sep 10, 2024 pm 05:25 PM

在本章中,我们将了解CakePHP中的环境变量、常规配置、数据库配置和电子邮件配置。

适用于 Ubuntu 和 Debian 的 PHP 8.4 安装和升级指南 适用于 Ubuntu 和 Debian 的 PHP 8.4 安装和升级指南 Dec 24, 2024 pm 04:42 PM

PHP 8.4 带来了多项新功能、安全性改进和性能改进,同时弃用和删除了大量功能。 本指南介绍了如何在 Ubuntu、Debian 或其衍生版本上安装 PHP 8.4 或升级到 PHP 8.4

CakePHP 日期和时间 CakePHP 日期和时间 Sep 10, 2024 pm 05:27 PM

为了在 cakephp4 中处理日期和时间,我们将使用可用的 FrozenTime 类。

CakePHP 文件上传 CakePHP 文件上传 Sep 10, 2024 pm 05:27 PM

为了进行文件上传,我们将使用表单助手。这是文件上传的示例。

CakePHP 路由 CakePHP 路由 Sep 10, 2024 pm 05:25 PM

在本章中,我们将学习以下与路由相关的主题?

讨论 CakePHP 讨论 CakePHP Sep 10, 2024 pm 05:28 PM

CakePHP 是 PHP 的开源框架。它的目的是使应用程序的开发、部署和维护变得更加容易。 CakePHP 基于类似 MVC 的架构,功能强大且易于掌握。模型、视图和控制器 gu

如何设置 Visual Studio Code (VS Code) 进行 PHP 开发 如何设置 Visual Studio Code (VS Code) 进行 PHP 开发 Dec 20, 2024 am 11:31 AM

Visual Studio Code,也称为 VS Code,是一个免费的源代码编辑器 - 或集成开发环境 (IDE) - 可用于所有主要操作系统。 VS Code 拥有针对多种编程语言的大量扩展,可以轻松编写

CakePHP 创建验证器 CakePHP 创建验证器 Sep 10, 2024 pm 05:26 PM

可以通过在控制器中添加以下两行来创建验证器。

See all articles