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 adodb介绍
Mar 19 PHP
PHP写MySQL数据 实现代码
Jun 15 PHP
PHP使用内置函数file_put_contents写入文件及追加内容的方法
Dec 07 PHP
两种php实现图片上传的方法
Jan 22 PHP
PHP连接MSSQL方法汇总
Feb 05 PHP
基于PHP实现等比压缩图片大小
Mar 04 PHP
CodeIgniter 完美解决URL含有中文字符串
May 13 PHP
老生常谈PHP面向对象之命令模式(必看篇)
May 24 PHP
PHP使用redis消息队列发布微博的方法示例
Jun 22 PHP
php实现微信模板消息推送
Mar 30 PHP
thinkPHP框架实现的无限回复评论功能示例
Jun 09 PHP
CI(CodeIgniter)框架中URL特殊字符处理与SQL注入隐患分析
Feb 28 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 UTF8编码内的繁简转换类
2009/07/20 PHP
PHP 判断变量类型实现代码
2009/10/23 PHP
php google或baidu分页代码
2009/11/26 PHP
从零开始学YII2框架(二)通过 Composer 安装扩展插件
2014/08/20 PHP
PHP基于PDO调用sqlserver存储过程通用方法【基于Yii框架】
2017/10/07 PHP
javascript编程起步(第七课)
2007/02/27 Javascript
潜说js对象和数组
2011/05/25 Javascript
面向对象的Javascript之二(接口实现介绍)
2012/01/27 Javascript
JQuery实现可直接编辑的表格
2015/04/16 Javascript
基于jQuery实现返回顶部实例代码
2016/01/01 Javascript
jQuery增加与删除table列的方法
2016/03/01 Javascript
JavaScript中获取纯正的undefined的方法
2016/03/06 Javascript
功能强大的Bootstrap效果展示(二)
2016/08/03 Javascript
JavaScript:ES2019 的新特性(译)
2019/08/08 Javascript
vue element-ui table组件动态生成表头和数据并修改单元格格式 父子组件通信
2019/08/15 Javascript
Layui数据表格之单元格编辑方式
2019/10/26 Javascript
[01:07:22]2014 DOTA2华西杯精英邀请赛 5 24 DK VS VG加赛
2014/05/26 DOTA
python开发中range()函数用法实例分析
2015/11/12 Python
matlab中实现矩阵删除一行或一列的方法
2018/04/04 Python
python爬虫URL重试机制的实现方法(python2.7以及python3.5)
2018/12/18 Python
学习python的前途 python挣钱
2019/02/27 Python
python中时间模块的基本使用教程
2019/05/14 Python
Django框架静态文件使用/中间件/禁用ip功能实例详解
2019/07/22 Python
使用pytorch搭建AlexNet操作(微调预训练模型及手动搭建)
2020/01/18 Python
python 模拟登录B站的示例代码
2020/12/15 Python
顶丰TOPPIK台湾官网:增发纤维假发,告别秃发困扰
2018/06/13 全球购物
荷兰照明、灯具和配件网上商店:dmlights
2019/08/25 全球购物
什么是Web Service?
2012/07/25 面试题
自考毕业自我鉴定
2014/03/18 职场文书
关于奉献的演讲稿
2014/05/21 职场文书
乡党政领导班子群众路线教育实践活动个人对照检查材料
2014/09/20 职场文书
2015高考寄语集锦
2015/02/27 职场文书
导游词之介休绵山
2019/12/31 职场文书
Axios取消重复请求的方法实例详解
2021/06/15 Javascript
oracle索引总结
2021/09/25 Oracle
微信小程序结合ThinkPHP5授权登陆后获取手机号
2021/11/23 PHP