PHP使用数组依次替换字符串中匹配项


Posted in PHP onJanuary 08, 2016

先来看个sql语句:

select * from table where ctime >= '[date-14]' and ctime <= '[date-1]';

想把上面这句sql的中括号表示的日期依次换成下面的数组中的元素array('2015-07-01','2015-07-15');

用正则匹配:找到第一个中括号部分,用第一个元素替换,然后找第二个,再替换

用sprintf函数:因为日期已经计算好,按照顺序替换就可以了.

PHP使用数组依次替换字符串中匹配项

因为markdown写正则比较麻烦,这里就直接上图片了

ps:设想一下,如sql中只有一个需要替换的时间条件,就需要修改成

$sql = sprintf($sql,$arr[0])

说白了呢就是如果sprintf函数支持第二个参数是数组就太好了。查了一番之后确实可以有解决办法:

call_user_func_array() 官方的解释是:

call_user_func_array — 调用回调函数,并把一个数组参数作为回调函数的参数

mixed call_user_func_array ( callable $callback , array $param_arr )

把第一个参数作为回调函数(callback)调用,把参数数组作(param_arr)为回调函数的的参数传入。

也就是说:第一个参数是你想要使用的函数名(上文中的sprintf),第二个参数是将要使用函数的参数,只不过参数是以数组形式传给了call_user_func_arrayok,这样的话就可以实现动态的替换了

$param = $arr;
array_unshift($param,$sql);
$sql = call_user_func_array('sprintf',$param);

接下来介绍str_replace — 子字符串替换,数组替换

说明

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

该函数返回一个字符串或者数组。该字符串或数组是将 subject 中全部的 search 都被 replace 替换之后的结果。

如果有一些特殊的替换需求(比如正则表达式),你应该使用该函数替换 ereg_replace() 和 preg_replace()。

参数

如果 search 和 replace 为数组,那么 str_replace() 将对 subject 做二者的映射替换。如果 replace 的值的个数少于 search 的个数,多余的替换将使用空字符串来进行。如果 search 是一个数组而 replace 是一个字符串,那么 search 中每个元素的替换将始终使用这个字符串。该转换不会改变大小写。
如果 search 和 replace 都是数组,它们的值将会被依次处理。

search

查找的目标值,也就是 needle。一个数组可以指定多个目标。

replace

search 的替换值。一个数组可以被用来指定多重替换。

subject

执行替换的数组或者字符串。也就是 haystack。

如果 subject 是一个数组,替换操作将遍历整个 subject,返回值也将是一个数组。

count

Note: 如果被指定,它将控制匹配和替换的次数。

返回值

该函数返回替换后的数组或者字符串。

版本 说明

5.0.0 新增 count 参数。

4.3.3 函数行为改变。旧的版本中存在一个 BUG —— 当 search 和 replace 两个参数都是数组的时候,将导致空的 search 索引被跳过,但是却没有同时前移 replace 内部指针。该错误发生在 PHP

4.3.3,任何依赖于此 BUG 的脚本应该先除去空的查找值,从而模拟原始的行为。

4.0.5 大多数参数都可以为数组。

范例

Example #1 str_replace() 基本范例

<?php
// 赋值: <body text='black'>
$bodytag = str_replace("%body%", "black", "<body text='%body%'>");
// 赋值: Hll Wrld f PHP
$vowels = array("a", "e", "i", "o", "u", "A", "E", "I", "O", "U");
$onlyconsonants = str_replace($vowels, "", "Hello World of PHP");
// 赋值: You should eat pizza, beer, and ice cream every day
$phrase = "You should eat fruits, vegetables, and fiber every day.";
$healthy = array("fruits", "vegetables", "fiber");
$yummy = array("pizza", "beer", "ice cream");
$newphrase = str_replace($healthy, $yummy, $phrase);
// 赋值: 2
$str = str_replace("ll", "", "good golly miss molly!", $count);
echo $count;
?>

Example #2 可能的 str_replace() 替换范例

<?php
// 替换顺序
$str = "Line 1\nLine 2\rLine 3\r\nLine 4\n";
$order = array("\r\n", "\n", "\r");
$replace = '<br />';
// 首先替换 \r\n 字符,因此它们不会被两次转换
$newstr = str_replace($order, $replace, $str);
// 输出 F ,因为 A 被 B 替换,B 又被 C 替换,以此类推...
// 由于从左到右依次替换,最终 E 被 F 替换
$search = array('A', 'B', 'C', 'D', 'E');
$replace = array('B', 'C', 'D', 'E', 'F');
$subject = 'A';
echo str_replace($search, $replace, $subject);
// 输出: apearpearle pear
// 由于上面提到的原因
$letters = array('a', 'p');
$fruit = array('apple', 'pear');
$text = 'a p';
$output = str_replace($letters, $fruit, $text);
echo $output;
?>

注释

Note: 此函数可安全用于二进制对象。

Caution

了解替换顺序

由于 str_replace() 的替换时从左到右依次进行的,进行多重替换的时候可能会替换掉之前插入的值。参见该文档的范例。

Note:

该函数区分大小写。使用 str_ireplace() 可以进行不区分大小写的替换。

PHP 相关文章推荐
php中关于codeigniter的xmlrpc的类在进行数据交换时的类型问题
Jul 03 PHP
抓取并下载CSS中所有图片文件的php代码
Sep 26 PHP
PHP实现根据浏览器跳转不同语言页面代码
Aug 02 PHP
php常用文件操作函数汇总
Nov 22 PHP
php对文件进行hash运算的方法
Apr 03 PHP
PHP去掉json字符串中的反斜杠\及去掉双引号前的反斜杠
Sep 30 PHP
php socket通信(tcp/udp)实例分析
Feb 14 PHP
Yii2框架dropDownList下拉菜单用法实例分析
Jul 18 PHP
简单谈谈PHP中的trait
Feb 25 PHP
PHP迭代与递归实现无限级分类
Aug 28 PHP
php mysql PDO 查询操作的实例详解
Sep 23 PHP
CodeIgniter框架数据库基本操作示例
May 24 PHP
PHP 7.0.2 正式版发布
Jan 08 #PHP
深入浅析php中sprintf与printf函数的用法及区别
Jan 08 #PHP
PHP中each与list用法分析
Jan 08 #PHP
PHP中list()函数用法实例简析
Jan 08 #PHP
PHP图像裁剪缩略裁切类源码及使用方法
Jan 07 #PHP
PHP中substr_count()函数获取子字符串出现次数的方法
Jan 07 #PHP
PHP使用strstr()函数获取指定字符串后所有字符的方法
Jan 07 #PHP
You might like
php中批量修改文件后缀名的函数代码
2011/10/23 PHP
解析array splice的移除数组中指定键的值,返回一个新的数组
2013/07/02 PHP
PHP在线书签系统分享
2016/01/04 PHP
Laravel框架实现redis集群的方法分析
2017/09/14 PHP
可以支持多中格式的JS键盘
2007/05/02 Javascript
javascript 全角转换实现代码
2009/07/17 Javascript
js实现横向伸展开的二级导航菜单代码
2015/08/28 Javascript
第一次接触JS require.js模块化工具
2016/04/17 Javascript
微信小程序 登录的简单实现
2017/04/19 Javascript
jquery图片放大镜效果
2017/06/23 jQuery
JavaScript中防止微信浏览器被整体拖动的方法
2017/08/25 Javascript
angular6的响应式表单的实现
2018/10/10 Javascript
详解关于JSON.parse()和JSON.stringify()的性能小测试
2019/03/14 Javascript
vue路由传参页面刷新参数丢失问题解决方案
2019/10/08 Javascript
微信小程序后端(java)开发流程的详细步骤
2019/11/13 Javascript
微信小程序实现音乐播放器
2019/11/20 Javascript
梳理一下vue中的生命周期
2020/12/30 Vue.js
Python中的装饰器用法详解
2015/01/14 Python
Python多线程结合队列下载百度音乐的方法
2015/07/27 Python
python matlibplot绘制多条曲线图
2021/02/19 Python
python3读取excel文件只提取某些行某些列的值方法
2018/07/10 Python
django如何连接已存在数据的数据库
2018/08/14 Python
python3中os.path模块下常用的用法总结【推荐】
2018/09/16 Python
python实现指定字符串补全空格、前面填充0的方法
2018/11/16 Python
从运行效率与开发效率比较Python和C++
2018/12/14 Python
Python实现Selenium自动化Page模式
2019/07/14 Python
这可能是最好玩的python GUI入门实例(推荐)
2019/07/19 Python
解决django 新增加用户信息出现错误的问题
2019/07/28 Python
Python目录和文件处理总结详解
2019/09/02 Python
pycharm新建Vue项目的方法步骤(图文)
2020/03/04 Python
python logging 重复写日志问题解决办法详解
2020/08/04 Python
社区志愿者培训方案
2014/06/10 职场文书
2014年关工委工作总结
2014/11/17 职场文书
2019年手机市场的调研报告2篇
2019/10/10 职场文书
python实现对doc、txt、xls等文档的读写操作
2022/04/02 Python
Java 垃圾回收超详细讲解记忆集和卡表
2022/04/08 Java/Android