详解PHP正则表达式替换实现(PHP preg_replace,PHP preg_replace)
PHP正则表达式替换实现是如何的呢?首先向你介绍下PHPpreg_replace,PHPpreg_replace的使用是我们实现的方法,那么对于PHP正则表达式替换实现过程我们从实例入手。
PHP正则表达式替换的相关概念:
preg_replace:执行正则表达式的搜索和替换
mixedpreg_replace( mixedpattern, mixedreplacement, mixedsubject[,intlimit])
preg_replace:允许你替换字符串中匹配到你定义的正则表达式。
一个简单的注释移除功能:
preg_replace('[(/*)+.+(*/)]','',$val);
这段代码可以移除在PHP和CSS中使用/*注释*/格式的多多行注释。其中的三个参数分别为正则表达式,要替换成的字符串和要替换的目标字符串(这里要做移除功能,所以是个空白字符串->'')。如果你想匹配次级规则,可以使用$0代表全部匹配,$1、$2等,以此类推代表分别的次级规则。
在subject中搜索pattern模式的匹配项并替换为replacement。如果指定了limit,则仅替换limit个匹配,如果省略limit或者其值为-1,则所有的匹配项都会被替换。
replacement可以包含//n形式或(自PHP4.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="April15,2003"; $pattern="/(/w+)(/d+),(/d+)/i"; $replacement="/${1}1,/$3"; printpreg_replace($pattern,$replacement,$string); /*Output ====== April1,2003 */ ?>
如果搜索到匹配项,则会返回被替换后的subject,否则返回原来不变的subject。
preg_replace()的每个参数(除了limit)都可以是一个数组。如果pattern和replacement都是数组,将以其键名在数组中出现的顺序来进行处理。这不一定和索引的数字顺序相同。如果使用索引来标识哪个pattern将被哪个replacement来替换,应该在调用preg_replace()之前用ksort()对数组进行排序。
例子2.在preg_replace()中使用索引数组
<?php $string= "Thequickbrownfoxjumpedoverthelazydog."; $patterns[0]="/quick/"; $patterns[1]="/brown/"; $patterns[2]="/fox/"; $replacements[2]="bear"; $replacements[1]="black"; $replacements[0]="slow"; printpreg_replace($patterns,$replacements,$string); /*Output ====== Thebearblackslowjumpedoverthelazydog. */ /*Byksortingpatternsandreplacements, weshouldgetwhatwewanted.*/ ksort($patterns); ksort($replacements); printpreg_replace($patterns,$replacements,$string); /*Output ====== Theslowblackbearjumpedoverthelazydog. */ ?>
如果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="); printpreg_replace ($patterns,$replace,"{startDate}=1999-5-27"); ?>
本例将输出:
$startDate=5/27/1999
例子4.使用/e修正符
<?php preg_replace ("/(<//?)(/w+)([^>]*>)/e", "'//1'.strtoupper('//2').'//3'", $html_body); ?>
这将使输入字符串中的所有HTML标记变成大写,以上的实例运行支持版本为PHP3>=3.0.9,PHP4。
PHP正则表达式替换的相关内容就向你介绍到这里,希望那个对你了解和掌握PHP正则表达式替换有所帮助。
用正则表达式替换内容php
以前做一个项目,就是有一个问答的页面,比如说在回答或者提问的内容中插入表情。写到内容里的是表情图片的名字(而且是不带后缀的,比如:f_002.png)表情包放在项目里,我需要在取除内容的时候将里面的表情名字替换成图片。
存到数据库中的内容是这样的: 不知道[f_013] (最后面的这个[f_013]就是表情图在数据库中存放的形式)
我需要做的就是从数据库中取出内容,并且把内容中的像这样的字符[f_013]处理成图片地址,很显然这里需要用到正则表达式。
1.首先我得先找到这个字符串
$rule="/(?:\[)(f_.[0-9]{1,3})(?:\])/i";
这个正则匹配可以帮我找到表情的字符串
2.找到后就是把这个字符串换成表情图片存放的地址,这里用到了一个函数就是正则表达式的替换。
就是这个函数:preg_match_all
echopreg_replace("/(?:\[)(f_.[0-9]{1,3})(?:\])/i","<imgsrc='__PUBLIC__/face/\${1}.png'>",$line['content']);
$line['content'] 这个是我从数据库中取出的内容,
"<imgsrc='__PUBLIC__/face/\${1}.png'>" 这个是我将要替换的图片地址,比如我的图片地址是这样的<imgsrc="__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']; }else { echopreg_replace("/(?:\[)(f_.[0-9]{1,3})(?:\])/i","<imgsrc='__PUBLIC__/face/\${1}.png'>",$line['content']); } ?>