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空间不支持socket但支持curl时recaptcha的用法
Nov 07 PHP
php魔术方法与魔术变量、内置方法与内置变量的深入分析
Jun 03 PHP
Windows下的PHP安装pear教程
Oct 24 PHP
微信支付开发维权通知实例
Jul 12 PHP
微信随机生成红包金额算法php版
Jul 21 PHP
php版微信开发Token验证失败或请求URL超时问题的解决方法
Sep 23 PHP
详解Yii2 定制表单输入字段的标签和样式
Jan 04 PHP
PHP获取当前执行php文件名的代码
Mar 02 PHP
ThinkPHP使用getlist方法实现数据搜索功能示例
May 08 PHP
PHP 网站修改默认访问文件的nginx配置
May 27 PHP
php+laravel依赖注入知识点总结
Nov 04 PHP
open_basedir restriction in effect. 原因与解决方法
Mar 14 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
Discuz 模板语句分析及知识技巧
2009/08/21 PHP
Session的工作机制详解和安全性问题(PHP实例讲解)
2014/04/10 PHP
PHP设计模式之适配器模式定义与用法详解
2018/04/03 PHP
PHP函数按引用传递参数及函数可选参数用法示例
2018/06/04 PHP
PHP htmlspecialchars_decode()函数用法讲解
2019/03/01 PHP
thinkphp诸多限制条件下如何getshell详解
2020/12/09 PHP
在 IE 中调用 javascript 打开 Excel 表
2006/12/21 Javascript
Javascript的一种模块模式
2010/09/08 Javascript
jquery缓动swing liner控制动画过程不同时刻的速度
2014/05/29 Javascript
浅谈jQuery的offset()方法及示例分享
2015/07/17 Javascript
jquery实现滑屏大图定时收缩为小banner图片的广告代码
2015/09/02 Javascript
原生的强大DOM选择器querySelector介绍
2016/12/21 Javascript
Angular.Js中ng-include指令的使用与实现
2017/05/07 Javascript
Jquery中.bind()、.live()、.delegate()和.on()之间的区别详解
2017/08/01 jQuery
详解微信小程序input标签正则初体验
2018/08/18 Javascript
Vue filter格式化时间戳时间成标准日期格式的方法
2018/09/16 Javascript
利用原生JavaScript实现造日历轮子实例代码
2019/05/08 Javascript
基于vue+axios+lrz.js微信端图片压缩上传方法
2019/06/25 Javascript
[51:32]Optic vs Serenity 2018国际邀请赛淘汰赛BO3 第一场 8.22
2018/08/23 DOTA
Python爬虫实现爬取京东手机页面的图片(实例代码)
2017/11/30 Python
Python计算公交发车时间的完整代码
2020/02/12 Python
Django 拼接两个queryset 或是两个不可以相加的对象实例
2020/03/28 Python
Python3之外部文件调用Django程序操作model等文件实现方式
2020/04/07 Python
keras实现VGG16方式(预测一张图片)
2020/07/07 Python
几款Python编译器比较与推荐(小结)
2020/10/15 Python
python中uuid模块实例浅析
2020/12/29 Python
AmazeUI中各种的导航式菜单与解决方法
2020/08/19 HTML / CSS
某/etc/fstab文件中的某行如下: /dev/had5 /mnt/dosdata msdos defaults,usrquota 1 2 请解释其含义
2013/04/11 面试题
电子商务专业个人的自我评价分享
2013/10/29 职场文书
开办化妆品公司创业计划书
2013/12/26 职场文书
护理专业自我鉴定
2014/01/30 职场文书
大学生考试作弊检讨书
2014/09/21 职场文书
群众路线查摆问题及整改措施
2014/10/10 职场文书
群众路线教育实践活动心得体会(四风)
2014/11/03 职场文书
干部考核工作总结
2015/08/12 职场文书
2019年家电促销广告语集锦
2019/10/21 职场文书