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使之能同时支持GIF和JPEG
Oct 09 PHP
php URL编码解码函数代码
Mar 10 PHP
php中使用preg_match_all匹配文章中的图片
Feb 06 PHP
PHP获取客户端真实IP地址的5种情况分析和实现代码
Jul 08 PHP
php使用GD库创建图片缩略图的方法
Jun 10 PHP
PHP编程开发怎么提高编程效率 提高PHP编程技术
Nov 09 PHP
PHP响应post请求上传文件的方法
Dec 17 PHP
PHP数组游标实现对数组的各种操作详解
Jan 26 PHP
PHP 将数组打乱 shuffle函数的用法及简单实例
Jun 17 PHP
PHP使用PDO访问oracle数据库的步骤详解
Sep 29 PHP
Discuz不使用插件实现简单的打赏功能
Mar 21 PHP
PHP实现字母数字混合验证码功能
Jul 11 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方法curl抓取AJAX异步内容思路分析及代码分享
2014/08/25 PHP
PHP实现文件上传功能实例代码
2017/05/18 PHP
Yii2框架中使用PHPExcel导出Excel文件的示例
2017/08/09 PHP
Laravel基础-关于引入公共文件的两种方式
2019/10/18 PHP
非常好的js代码
2006/06/27 Javascript
js操作checkbox遇到的问题解决
2013/06/29 Javascript
jQuery遍历Form示例代码
2013/09/03 Javascript
JS页面延迟执行一些方法(整理)
2013/11/11 Javascript
javascript中对Attr(dom中属性)的操作示例讲解
2013/12/02 Javascript
在JS中如何调用JSP中的变量
2014/01/22 Javascript
php is_numberic函数造成的SQL注入漏洞
2014/03/10 Javascript
js 模式窗口(模式对话框和非模式对话框)的使用介绍
2014/07/17 Javascript
JavaScript+canvas实现七色板效果实例
2016/02/18 Javascript
js利用正则表达式检验输入内容是否为网址
2016/07/05 Javascript
jQuery的 $.ajax防止重复提交的两种方法(推荐)
2016/10/14 Javascript
JavaScript用200行代码制作打飞机小游戏实例
2017/06/21 Javascript
EasyUI Tree树组件无限循环的解决方法
2017/09/27 Javascript
JavaScript箭头函数中的this详解
2019/06/19 Javascript
Layui之table中的radio在切换分页时无法记住选中状态的解决方法
2019/09/02 Javascript
浅析Vue 防抖与节流的使用
2019/11/14 Javascript
vue项目使用高德地图的定位及关键字搜索功能的实例代码(踩坑经验)
2020/03/07 Javascript
如何构建一个Vue插件并生成npm包
2020/10/26 Javascript
python使用cookie库操保存cookie详解
2014/03/03 Python
Python深入学习之内存管理
2014/08/31 Python
Python数据类型中的“冒号“[::]——分片与步长操作示例
2018/01/24 Python
详解pandas如何去掉、过滤数据集中的某些值或者某些行?
2019/05/15 Python
python里运用私有属性和方法总结
2019/07/08 Python
Python爬虫学习之获取指定网页源码
2019/07/30 Python
python retrying模块的使用方法详解
2019/09/25 Python
Python提取PDF内容的方法(文本、图像、线条等)
2019/09/25 Python
python IP地址转整数
2020/11/20 Python
加拿大床上用品、家居装饰、厨房和浴室产品购物网站:Linen Chest
2018/06/05 全球购物
责任胜于能力演讲稿
2014/05/20 职场文书
环保志愿者活动总结
2014/06/27 职场文书
ORACLE数据库对long类型字段进行模糊匹配的解决思路
2021/04/07 Oracle
如何使用Tkinter进行窗口的管理与设置
2021/06/30 Python