PHP preg_replace正则表达式 replace报错,应该怎么办?

旗下栏目:
您现在的位置: >
详解PHP正则表达式替换实现(PHP preg_replace,PHP preg_replace)
所属栏目:
发布时间:
| 小编:豆豆
PHP正则表达式替换实现是如何的呢?首先向你介绍下PHP preg_replace,PHP preg_replace的使用是我们实现的方法,那么对于PHP正则表达式替换实现过程我们从实例入手。PHP正则表达式替换的相关概念:preg_replace:执行正则表达式的搜索和替换。mixed&preg_replace&(&&
mixed&pattern,&&
mixed&replacement,&&
mixed&subject&[,&int&limit])preg_replace:允许你替换字符串中匹配到你定义的正则表达式。一个简单的注释移除功能:preg_replace('[(/*)+.+(*/)]', '', $val);这段代码可以移除在 PHP 和 CSS 中使用 /* 注释 */ 格式的多多行注释。其中的三个参数分别为正则表达式,要替换成的字符串和要替换的目标字符串(这里要做移除功能,所以是个空白字符串 -& '')。如果你想匹配次级规则,可以使用 $0 代表全部匹配,$1、$2 等,以此类推代表分别的次级规则。在 subject 中搜索 pattern 模式的匹配项并替换为 replacement。如果指定了 limit,则仅替换 limit 个匹配,如果省略 limit 或者其值为 -1,则所有的匹配项都会被替换。replacement 可以包含 //n 形式或(自 PHP 4.0.4 起)$n 形式的逆向引用,首选使用后者。每个此种引用将被替换为与第 n 个被捕获的括号内的子模式所匹配的文本。n 可以从 0 到 99,其中 //0 或 $0 指的是被整个模式所匹配的文本。对左圆括号从左到右计数(从 1 开始)以取得子模式的数目。对替换模式在一个逆向引用后面紧接着一个数字时(即:紧接在一个匹配的模式后面的数字),不能使用熟悉的 //1 符号来表示逆向引用。举例说 //11,将会使 preg_replace() 搞不清楚是想要一个 //1 的逆向引用后面跟着一个数字 1 还是一个 //11 的逆向引用。本例中的解决方法是使用 /${1}1。这会形成一个隔离的 $1 逆向引用,而使另一个 1 只是单纯的文字。PHP正则表达式替换的相关实例:例子 1. 逆向引用后面紧接着数字的用法&?php&
$string&=&&April&15,&2003&;&
$pattern&=&&/(/w+)&(/d+),&(/d+)/i&;&
$replacement&=&&/${1}1,/$3&;&
print&preg_replace($pattern,&$replacement,&$string);&
/*&Output&
April1,2003&
?&如果搜索到匹配项,则会返回被替换后的 subject,否则返回原来不变的 subject。preg_replace() 的每个参数(除了 limit)都可以是一个数组。如果 pattern 和 replacement 都是数组,将以其键名在数组中出现的顺序来进行处理。这不一定和索引的数字顺序相同。如果使用索引来标识哪个 pattern 将被哪个 replacement 来替换,应该在调用 preg_replace() 之前用 ksort() 对数组进行排序。例子 2. 在 preg_replace() 中使用索引数组&?php&
$string&=&&
&The&quick&brown&fox&jumped&over&the&lazy&dog.&;&
$patterns[0]&=&&/quick/&;&
$patterns[1]&=&&/brown/&;&
$patterns[2]&=&&/fox/&;&
$replacements[2]&=&&bear&;&
$replacements[1]&=&&black&;&
$replacements[0]&=&&slow&;&
print&preg_replace($patterns,&$replacements,&$string);&
/*&Output&
The&bear&black&slow&jumped&over&the&lazy&dog.&
/*&By&ksorting&patterns&and&replacements,&
&&we&should&get&what&we&wanted.&*/
ksort($patterns);&
ksort($replacements);&
print&preg_replace($patterns,&$replacements,&$string);&
/*&Output&
The&slow&black&bear&jumped&over&the&lazy&dog.&
?&如果 subject 是个数组,则会对 subject 中的每个项目执行搜索和替换,并返回一个数组。如果 pattern 和 replacement 都是数组,则 preg_replace() 会依次从中分别取出值来对 subject 进行搜索和替换。如果 replacement 中的值比 pattern 中的少,则用空字符串作为余下的替换值。如果 pattern 是数组而 replacement 是字符串,则对 pattern 中的每个值都用此字符串作为替换值。反过来则没有意义了。/e 修正符使 preg_replace() 将 replacement 参数当作 PHP 代码(在适当的逆向引用替换完之后)。提示:要确保 replacement 构成一个合法的 PHP 代码字符串,否则 PHP 会在报告在包含 preg_replace() 的行中出现语法解析错误。例子 3. 替换数个值&?php&
$patterns&=&array&
(&/(19|20)(/d{2})-(/d{1,2})-(/d{1,2})/&,&
&&&&&&&&&&&/^/s*{(/w+)}/s*=/&);&
$replace&=&array&
(&//3///4///1//2&,&&$//1&=&);&
print&preg_replace&&
($patterns,&$replace,&&{startDate}&=&&);&
?&本例将输出:$startDate = 5/27/1999例子 4. 使用 /e 修正符&?php&
preg_replace&&
(&/(&//?)(/w+)([^&]*&)/e&,&
&'//1'.strtoupper('//2').'//3'&,&
$html_body);&
?&这将使输入字符串中的所有 HTML 标记变成大写,以上的实例运行支持版本为PHP 3&= 3.0.9, PHP 4。PHP正则表达式替换的相关内容就向你介绍到这里,希望那个对你了解和掌握PHP正则表达式替换有所帮助。用正则表达式替换内容 php以前做一个项目,就是有一个问答的页面,比如说在回答或者提问的内容中插入表情。写到内容里的是表情图片的名字(而且是不带后缀的,比如:f_002.png)表情包放在项目里,我需要在取除内容的时候将里面的表情名字替换成图片。存到数据库中的内容是这样的:不知道[f_013]&&& (最后面的这个[f_013]就是表情图在数据库中存放的形式)。我需要做的就是从数据库中取出内容,并且把内容中的像这样的字符 [f_013] 处理成图片地址,很显然这里需要用到正则表达式。1.首先我得先找到这个字符串$rule = &/(?:\[)(f_.[0-9]{1,3})(?:\])/i&;这个正则匹配可以帮我找到表情的字符串。2.找到后就是把这个字符串换成表情图片存放的地址,这里用到了一个函数就是正则表达式的替换。就是这个函数:preg_match_all。echo preg_replace(&/(?:\[)(f_.[0-9]{1,3})(?:\])/i&,&&img src='__PUBLIC__/face/\${1}.png'&&,$line['content']);$line['content']&& 这个是我从数据库中取出的内容。&&img src='__PUBLIC__/face/\${1}.png'&&& 这个是我将要替换的图片地址,比如我的图片地址是这样的&img src=&__PUBLIC__/face/f_013.png&&这里面有一个非常重要的知识点: &\${1}&&& 它就是那个存放在数据库里面表情的字符串。\${1} = f_013我这里有我替换的一个完整代码:&?php
$result&=&array();
&&&$n&=&preg_match_all(&/(?:\[)(f_.[0-9]{1,3})(?:\])/i&,$line['content'],&$result);&/*返回查找到符合条件的字符串的个数*/
&&&if($n&==&0&||&$n&==&false)&&/*如果是0或者false就说明没有表情*/
&&&&echo&$line['content'];
&&&  echo&preg_replace(&/(?:\[)(f_.[0-9]{1,3})(?:\])/i&,&&img&src='__PUBLIC__/face/\${1}.png'&&,$line['content']);
相关阅读:
看过本文的人还看过
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。&&&您需要以后才能回答,未注册用户请先。PHP安全之慎用preg_replace的/e修饰符 - 推酷
PHP安全之慎用preg_replace的/e修饰符
PHP以其易用性和可移植性正被广泛应用于WEB开发。然而,在我们使用的过程中,也要十分小心,从随处可见的XSS(新浪微博发送大量垃圾信息事件)到前段时间爆出来的Hash冲突的DDOS攻击,最近,wooyun上面发布了一个关于ThinkPHP框架的漏洞(最新版已经修复),以前也是我用过的第一个框架,昨晚花时间重现了一下,查阅了下程序的原理。本文主要来重现该漏洞,然后分析代码,给出漏洞的原因,用这个漏洞去检验可能对系统造成的破坏,最后总结,防范的方法。
漏洞主要是由mixed&preg_replace&(&mixed&pattern,&mixed&replacement,&mixed&subject&[,&int&limit]) 这个函数引起的,我们先看官方说明:
/e&修 正符使&preg_replace()&将&replacement&参数当作&PHP&代码(在适当的逆向引用替换完之后)。提示:要确保&replacement&构成一个合法的&PHP&代码字符串,否则&PHP&会在报告在包含&preg_replace()&的行中出现语法解析错 误。
我们不妨先看一下这个示例
preg_replace(
&jutst test&
如果我们提交?h=phpinfo(),phpinfo()将会被执行(使用/e修饰符,preg_replace会将&replacement&参数当作&PHP&代码执行)。这个正则被正确的匹配到,在进行替换的过程中,需要将$_GET[&h&]传入的String当作函数来运行,因此phpinfo()被成功执行。
代码如下:
preg_replace(&/test/e&,$_GET[&h&],&jutst test&);
访问的url : ?h=phpinfo()
进而,我们进入ThinkPHP的源码,下载2.1版(2.1以后已经被修复)。在/ThinikPHP/Lib/ThinkPHP/Util/Dispatcher.class.php的dispatch函数中,找到这句话:
在ThinkPHP的路由功能中,很多地方用到了preg_replace函数的/e参数,然而最严重的是这个文件中的这句话,因为几乎影响了所有使用Thinkphp的项目。
显然,这个使用了/e函数,会导致第二个参数当作函数使用。我们来分析一下这句话:
正则匹配的是 :字母开头,加上“/”分隔符,后面跟一个非”/”的元素,被替换成$var[&分隔符前的字母&]=分隔符后的值;作者的本意是要将这么一对一对的参数/值的形式的url写入到 $var[$key] = $value的数组中。
例如:URL,index.php?s=/model/action/par1/value1
将被解析成 :model模块的action方法,参数的处理放在这句话中,$deprde的值是“/”,由于/par1/value1(剩余的URL参数)匹配到了正则表达式,则会用第二个参数去进行替换。那么第二个参数应该被当作一个php语句来执行,他是一个赋值语句,执行的结果为:$var[&par1&] = “value1″,作者以此来达到分析url的目的,也实现了ThinkPHP的C层。
但是在赋值的时候,使用的是双引号。危险的地方实际上在这里,在 php中,双引号里面如果包含有变量,php解释器会将其替换为变量解释后的结果;单引号中的变量不会被处理。可以先做如下测试:
$a = “{${phpinfo()}}”;&& phpinfo会被成功执行。因此,我们将第二个变量替换成我们需要的函数,构造出来的攻击url大致如下:
http://host/index.php/Model/Action/par/
${@print(THINK_VERSION)}
,使用examlpe里面的Blog示例,快速搭建一个Thinkphp项目,然后访问http://host/index.php/Model/Action/par/
${@print(THINK_VERSION)},可以在左上角打印出当前的TP版本,利用这个来执行php函数,
相当于开启了一个PHP的一句话后门。
具体分析是:这句话的/par /${@print(THINK_VERSION)}将匹配到正则表达式,将会执行第二个参数,具体语句是$var['par'] = “
${@print(THINK_VERSION)}
“; 问题出在双引号上面,这个会执行里面的语句,包含很多危险的语句,包含phpinfo(),读取数据库配置等等。
截至目前,在Google上还可以找到许多这样的站点,很多站点都可以直接执行phpinfo(),在新版的ThinkPHP中已经修复了这个漏洞,将第二个参数的双引号改为单引号:
'$var[\'\\1\']='\\2';'
在我们以后使用preg_replace的/e修饰符的时候,需要注意这个双引号和单引号,像框架类的漏洞,一般影响的范围都非常的广。
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致PHP preg_replace() 正则替换所有符合条件的字符串_图文_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
PHP preg_replace() 正则替换所有符合条件的字符串
上传于|0|0|文档简介
&&PHP preg_replace() 正则替换,与Javascript 正则替换不同,PHP preg_replace() 默认就是替换所有符号匹配条件的元素
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩8页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢当前位置:&>&&>&php函数preg_replace 正则过滤掉div中所有内容preg_replace&--&执行正则表达式的搜索和替换mixed preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit] )在subject中搜索pattern模式的匹配项并替换为replacement。如果指定了limit,则仅替换lpreg_replace&--&执行正则表达式的搜索和替换mixed preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit] )在subject中搜索pattern模式的匹配项并替换为replacement。如果指定了limit,则仅替换limit个匹配,如果省略limit或者其值为 -1,则所有的匹配项都会被替换。例:$string&=&'hello&div&class&=&&div&&hello,div&/div&&p&class&=&&p&&hello,p&/p&';
$string&=&preg_replace('/&div(.*)&\/div&/is',&'',&$string);&&&//正则匹配,去掉文章中的DIV
echo&$输出:hello
hello,p可以看到,通过正则匹配,去掉了div并且div中的内容也一并去掉了,怎么过滤内容其实就看正则怎么写了。扩展:摘自网上的学习笔记&?php
$str=&as2223adfsf0s4df0sdfsdf&;
echo&preg_replace(&/0/&,&&,$str);//去掉0字符,此时相当于&replace的功能,&preg_replace(&/0/&,&A&,$str);&这样就是将0变成A的意思了
echo&preg_replace(&/[0-9]/&,&&,$str);//去掉所有数字
echo&preg_replace(&/[a-z]/&,&&,$str);&//这样是去掉所有小写字母
echo&preg_replace(&/[A-Z]/&,&&,$str);&//这样是去掉所有大写字母
echo&preg_replace(&/[a-z,A-Z]/&,&&,$str);&//这样是去掉所有字母
$str=&as2223adfsAAf0s4df0s中国人dD中南海DDfsdf&;
echo&preg_replace(&/[a-z,A-Z,0-9]/&,&&,$str);&//去掉所有字母和数字
经过以上的例子,相信大家知道,[&]&和里面的,有什么作用了。也可以看到,匹配的字符串必须加&/&/(看例子的第一个参数)
$str=&acsdcs&&sc&6666&sdcd&;
echo&preg_replace(&/&.*&/&,&&,$str);
//这个是表示去除以&开头,以&结尾的那部份,输出结果是:acsdcssdcd
注意:上面的&.*&是表示任何字符,也就是说不管&&包住的是什么都去掉其中.&表示任意字符,&*&表示任意个数
现在我们来改动一下,如果不想是任何个数呢?
$str=&acsdcs&&sc&6666&sdcd&;
echo&preg_replace(&/&.{4}&/&,&&,$str);&//此时输出:acsdcs&&scsdcd因为{4}指定了条件:&&内为4个字符的才满足条件,所以&&不符合条件,没有被替换。
注意:这时我们又学到了一个知识点{数字}&表示指定前面的个数,*就表示是任意个(0--无限个)
表示重复次数的除了&*,&{指定次数}&表示,还有很多表达形式:
$str=&acsdcs&&sc&6666&sd&&cd&;
echo&preg_replace(&/&[0-9]*&/&,&&,$str);
//输出acsdcscd
echo&&&hr&&;
echo&preg_replace(&/&[0-9]+&/&,&&,$str);
//输入acsdcsscsd&&cd
上面的例子只要是为了&表达&*&与+的区别&,*&表示重复0数或n&次,而+&表示1次以上,即一例中&[0-9]+&&表示&&里面至少要有一个数字才符合条件。
相信这时大家知道,为什么上例中用*&和用+输出的结果不同了吧
$str=&acsdcs&&sc&6666&sd&&cd&;
echo&preg_replace(&/&[0-9]?&/&,&&,$str);
//输出acsdcs&&sc&6666&sdcd
看[0-9]?&这里的?表示要是0次或1&次,超过1次又不符合条件了。
总结一下,上面我们学会了&*&+&?&和大括号{}表示重复次数的方法。
----------------------------------------------------------------------------------------------------
&&&&$s=preg_replace(&/(.*?[月票|求|更].*?)/i&,&&,$s);
&&&&preg_match_all('/href=\&([0-9]+)\.shtm&&(.+?)&\/a&/i',$s,$arr_dstorycate);&&&&
&&&&print_r($arr_dstorycate);
----------------------------------------------------------------------------------------------------
&&&preg_match_all(&/&img.*?src=[\\\'|&\\\&](.*?(?:[\.gif|\.jpg]))[\\\'|\\\&].*?[\/]?&/i&,$content,$arr_dstorycate);&&&&&&&&&&&&
&&&print_r($arr_dstorycate);------分隔线----------------------------上一篇:下一篇:评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)热点推荐大多数据情况下我们对于session过期时间使用的是默认设置的时间,而对于一些有特殊要求的情况下我们可以设置一下session过期时间。对此,可以在PHP中,设置php.ini,找到session.gc_maxlifetime = 1440 #(PH...stringnumber_format(float$number[,int$decimals]) string number_format (float$number,int$decimals,string$dec_point,string$thousands_sep) decimals:小数点后面2位 dec_point:小数点用什么符号 thousands_sep:每隔3位时用什么符号 eg: ?php...
以前在去掉数组的空值是都是强写foreach或者while的,利用这两个语法结构来删除数组中的空元素,简单代码如下:PHP代码$v){
i...PHP max() max() 函数:返回参数中数值最大的值,可以比较无限多个值。 语法: mixed max( number arg1, number arg2 ... ) mixed max( array numbers [, array ...] ) 例子: ?phpecho max(1, 3, 5); // 输出:5echo max(array(2, 4, 5))...热点内容

我要回帖

更多关于 正则表达式 replace 的文章

 

随机推荐