关于字符串替换及preg_replace函数的后向引用_PHP教程
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了关于字符串替换及preg_replace函数的后向引用_PHP教程,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2092字,纯文字阅读大概需要3分钟。
内容图文
在 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.com/manual/zh/function.str-replace.php
[2] http://php.com/manual/zh/function.preg-replace.php
http://www.bkjia.com/PHPjc/363791.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/363791.htmlTechArticle在 PHP 里面替换字符串有很多种方法,str_replace 是再常见不过了,复杂一点的也可能会用到 preg_replace 方法。 这两个方法(str_replace 和 pre...
内容总结
以上是互联网集市为您收集整理的关于字符串替换及preg_replace函数的后向引用_PHP教程全部内容,希望文章能够帮你解决关于字符串替换及preg_replace函数的后向引用_PHP教程所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。