如何在PHP中使用正则表达式进行查找替换
1.preg_match—执行一个正则表达式匹配intpreg_match(string$pattern,string$subject[,array&$matches[,int$flags=0[,int$offset=0]]])搜索subject与pattern给定的正则表达式的一个匹配.pattern:要搜索的模式,字符串类型。subject:输入字符串。matches:如果提供了参数matches,它将被填充为搜索结果。$matches[0]将包含完整模式匹配到的文本,$matches[1]将包含第一个捕获子组匹配到的文本,以此类推。flags:flags可以被设置为以下标记值:PREG_OFFSET_CAPTURE如果传递了这个标记,对于每一个出现的匹配返回时会附加字符串偏移量(相对于目标字符串的)。注意:这会改变填充到matches参数的数组,使其每个元素成为一个由第0个元素是匹配到的字符串,第1个元素是该匹配字符串在目标字符串subject中的偏移量。offset:通常,搜索从目标字符串的开始位置开始。可选参数offset用于指定从目标字符串的某个未知开始搜索(单位是字节)。返回值:preg_match()返回pattern的匹配次数。它的值将是0次(不匹配)或1次,因为preg_match()在第一次匹配后将会停止搜索。preg_match_all()不同于此,它会一直搜索subject直到到达结尾。如果发生错误preg_match()返回FALSE。示例:
复制代码代码如下:
"."\n";/将会输出:Array([0]=>,PHP[1]=>PHP)/$matches=array();preg_match("/,\s(php)/i","Inmypoint,PHPisthewebscriptinglanguageofchoice.Ilovephp",$matches);print_r($matches);echo" "."\n";/将会输出:Array([0]=>Array([0]=>,PHP[1]=>11)[1]=>Array([0]=>PHP[1]=>13))/preg_match("/,\s(php)/i","Inmypoint,PHPisthewebscriptinglanguageofchoice.Ilovephp",$matches,PREG_OFFSET_CAPTURE);print_r($matches);echo" "."\n";/将会输出:Array([0]=>Array([0]=>ephp[1]=63)[1]=>Array([0]=>php[1]=>65))/preg_match("/[,a-z]?\s(php)/i","Inmypoint,PHPisthewebscriptinglanguageofchoice.Ilovephp",$matches,PREG_OFFSET_CAPTURE,28);print_r($matches);echo" "."\n";?>
2.preg_match_all—执行一个全局正则表达式匹配intpreg_match_all(string$pattern,string$subject[,array&$matches[,int$flags=PREG_PATTERN_ORDER[,int$offset=0]]])搜索subject中所有匹配pattern给定正则表达式的匹配结果并且将它们以flag指定顺序输出到matches中.在第一个匹配找到后,子序列继续从最后一次匹配位置搜索.pattern:要搜索的模式,字符串形式。subject:输入字符串。matches:多维数组,作为输出参数输出所有匹配结果,数组排序通过flags指定。flags:可以结合下面标记使用(注意不能同时使用PREG_PATTERN_ORDER和PREG_SET_ORDER),如果没有给定排序标记,假定设置为PREG_PATTERN_ORDER:PREG_PATTERN_ORDER:结果排序为$matches[0]保存完整模式的所有匹配,$matches[1]保存第一个子组的所有匹配,以此类推。PREG_SET_ORDER:结果排序为$matches[0]包含第一次匹配得到的所有匹配(包含子组),$matches[1]是包含第二次匹配到的所有匹配(包含子组)的数组,以此类推。PREG_OFFSET_CAPTURE:如果这个标记被传递,每个发现的匹配返回时会增加它相对目标字符串的偏移量。注意这会改变matches中的每一个匹配结果字符串元素,使其成为一个第0个元素为匹配结果字符串,第1个元素为匹配结果字符串在subject中的偏移量。返回值:返回完整匹配次数(可能是0),或者如果发生错误返回FALSE。示例:
复制代码代码如下:
"."\n";/将会输出:Array([0]=>,PHP[1]=>PHP)/$matches=array();preg_match("/[,a-z]?\s(php)/i","Inmypoint,PHPisthewebscriptinglanguageofchoice.Ilovephp",$matches);print_r($matches);echo" "."\n";/将会输出:Array([0]=>Array([0]=>,PHP[1]=>ephp)[1]=>Array([0]=>PHP[1]=>php))/$matches=array();preg_match_all("/[,a-z]?\s(php)/i","Inmypoint,PHPisthewebscriptinglanguageofchoice.Ilovephp",$matches,PREG_PATTERN_ORDER);print_r($matches);echo" "."\n";/将会输出:Array([0]=>Array([0]=>Array([0]=>,PHP[1]=>11)[1]=>Array([0]=>PHP[1]=>13))[1]=>Array([0]=>Array([0]=>ephp[1]=>63)[1]=>Array([0]=>php[1]=>65)))/$matches=array();preg_match_all("/[,a-z]?\s(php)/i","Inmypoint,PHPisthewebscriptinglanguageofchoice.Ilovephp",$matches,PREG_SET_ORDER|PREG_OFFSET_CAPTURE);print_r($matches);echo" "."\n";/Array([0]=>Array([0]=>ephp[1]=>63)[1]=>Array([0]=>php[1]=>65))/$matches=array();preg_match_all("/[,a-z]?\s(php)/i","Inmypoint,PHPisthewebscriptinglanguageofchoice.Ilovephp",$matches,PREG_SET_ORDER|PREG_OFFSET_CAPTURE,28);print_r($matches);echo" "."\n";?>
3.preg_split—通过一个正则表达式分隔字符串arraypreg_split(string$pattern,string$subject[,int$limit=-1[,int$flags=0]])通过一个正则表达式分隔给定字符串.pattern:用于搜索的模式,字符串形式。subject:输入字符串limit:如果指定,将限制分隔得到的子串最多只有limit个,返回的最后一个子串将包含所有剩余部分。limit值为-1,0或null时都代表"不限制",作为php的标准,你可以使用null跳过对flags的设置。flags:flags可以是任何下面标记的组合(以位或运算|组合):PREG_SPLIT_NO_EMPTY:如果这个标记被设置,preg_split()将进返回分隔后的非空部分。PREG_SPLIT_DELIM_CAPTURE:如果这个标记设置了,用于分隔的模式中的括号表达式将被捕获并返回。PREG_SPLIT_OFFSET_CAPTURE:如果这个标记被设置,对于每一个出现的匹配返回时将会附加字符串偏移量.注意:这将会改变返回数组中的每一个元素,使其每个元素成为一个由第0个元素为分隔后的子串,第1个元素为该子串在subject中的偏移量组成的数组。返回值:返回一个使用pattern边界分隔subject后得到的子串组成的数组。示例:
复制代码代码如下:
Inmypoint,[1]=>isthewebscriptinglanguageofchoice.Ilove[2]=>)/$matches=array();print_r(preg_split("/php/i","Inmypoint,PHPisthewebscriptinglanguageofchoice.Ilovephp"));echo" "."\n";/将会输出:Array([0]=>Inmypoint,[1]=>isthewebscriptinglanguageofchoice.Ilovephp)/$matches=array();print_r(preg_split("/php/i","Inmypoint,PHPisthewebscriptinglanguageofchoice.Ilwww.visa158.com));echo" "."\n";/将会输出:Array([0]=>Inmypoint,[1]=>isthewebscriptinglanguageofchoice.Ilove)/$matches=array();print_r(preg_split("/php/i","Inmypoint,PHPisthewebscriptinglanguageofchoice.Ilovephp",-1,PREG_SPLIT_NO_EMPTY));echo" "."\n";?>
4.preg_quote—转义正则表达式字符stringpreg_quote(string$str[,string$delimiter=NULL])preg_quote()需要参数str并向其中每个正则表达式语法中的字符前增加一个反斜线。这通常用于你有一些运行时字符串需要作为正则表达式进行匹配的时候。正则表达式特殊字符有:.\+?[^]$(){}=!<>|:-str:输入字符串delimiter:如果指定了可选参数delimiter,它也会被转义。这通常用于转义PCRE函数使用的分隔符。/是最通用的分隔符。返回值:返回转义后的字符串。示例:
复制代码代码如下:
".$word."",$textbody);//将会输出Thisbookisverydifficulttofind.echohtmlspecialchars($textbody);?>
5.preg_grep—返回匹配模式的数组条目arraypreg_grep(string$pattern,array$input[,int$flags=0])返回给定数组input中与模式pattern匹配的元素组成的数组.pattern:要搜索的模式,字符串形式.input:输入数组.flags:如果设置为PREG_GREP_INVERT,这个函数返回输入数组中与给定模式pattern不匹配的元素组成的数组.返回值:返回使用input中key做索引的数组.示例:
复制代码代码如下:
123.22[5]=>33.2[6]=>0.22)$fl_array=preg_grep("/^(\d+)?\.\d+$/",$array);print_r($fl_array);//返回所有包含浮点数的元素//输出:Array([0]=>abc[1]=>dd[2]=>123[4]=>word123)$fl_array=preg_grep("/^(\d+)?\.\d+$/",$array,PREG_GREP_INVERT);print_r($fl_array);?>
6.preg_replace—执行一个正则表达式的搜索和替换mixedpreg_replace(mixed$pattern,mixed$replacement,mixed$subject[,int$limit=-1[,int&$count]])搜索subject中匹配pattern的部分,以replacement进行替换。pattern:要搜索的模式。可以是一个字符串或字符串数组。可以使用一些PCRE修饰符,包括''e''(PREG_REPLACE_EVAL),可以为这个函数指定。replacement:用于替换的字符串或字符串数组。如果这个参数是一个字符串,并且pattern是一个数组,那么所有的模式都使用这个字符串进行替换。如果pattern和replacement都是数组,每个pattern使用replacement中对应的元素进行替换。如果replacement中的元素比pattern中的少,多出来的pattern使用空字符串进行替换。replacement中可以包含后向引用\\n或(php4.0.4以上可用)$n,语法上首选后者。每个这样的引用将被匹配到的第n个捕获子组捕获到的文本替换。n可以是0-99,\\0和$0代表完整的模式匹配文本。捕获子组的序号计数方式为:代表捕获子组的左括号从左到右,从1开始数。如果要在replacement中使用反斜线,必须使用4个("\\\\",译注:因为这首先是php的字符串,经过转义后,是两个,再经过正则表达式引擎后才被认为是一个原文反斜线)。当在替换模式下工作并且后向引用后面紧跟着需要是另外一个数字(比如:在一个匹配模式后紧接着增加一个原文数字),不能使用\\1这样的语法来描述后向引用。比如,\\11将会使preg_replace()不能理解你希望的是一个\\1后向引用紧跟一个原文1,还是一个\\11后向引用后面不跟任何东西。这种情况下解决方案是使用${1}1。这创建了一个独立的$1后向引用,一个独立的原文1。当使用e修饰符时,这个函数会转义一些字符(即:''、"、\和NULL)然后进行后向引用替换。当这些完成后请确保后向引用解析完后没有单引号或双引号引起的语法错误(比如:''strlen(\''$1\'')+strlen("$2")'')。确保符合PHP的字符串语法,并且符合eval语法。因为在完成替换后,引擎会将结果字符串作为php代码使用eval方式进行评估并将返回值作为最终参与替换的字符串。subject:要进行搜索和替换的字符串或字符串数组。如果subject是一个数组,搜索和替换回在subject的每一个元素上进行,并且返回值也会是一个数组。limit:每个模式在每个subject上进行替换的最大次数。默认是-1(无限)。count:如果指定,将会被填充为完成的替换次数。返回值:如果subject是一个数组,preg_replace()返回一个数组,其他情况下返回一个字符串。如果匹配被查找到,替换后的subject被返回,其他情况下返回没有改变的subject。如果发生错误,返回NULL。示例:使用后向引用紧跟数值原文:
复制代码代码如下:
${1}1,\\3'';echopreg_replace($pattern,$replacement,$string);?>
preg_replace()中使用基于索引的数组:
复制代码代码如下:
$string=''Thequickbrownfoxjumpedoverthelazydog.'';$patterns=array();$patterns[0]=''/quick/'';$patterns[1]=''/brown/'';$patterns[2]=''/fox/'';$replacements=array();$replacements[2]=''bear'';$replacements[1]=''black'';$replacements[0]=''slow'';//会输出:Thebearblackslowjumpedoverthelazydog.echopreg_replace($patterns,$replacements,$string);//对模式和替换内容按key进行排序我们可以得到期望的结果.ksort($patterns);ksort($replacements);//会输出:Theslowblackbearjumpedoverthelazydog.echopreg_replace($patterns,$replacements,$string);
替换一些值:
复制代码代码如下:
使用修饰符''e'':
复制代码代码如下:
hello";//会输出:hello echowww.hunanwang.netars(preg_replace("/(<\/?)(\w+)([^>]>)/e","''\\1''.strtoupper(''\\2'').''\\3''",$html_body));?>
剥离空白字符:
复制代码代码如下:
使用参数count:
复制代码代码如下:
7.preg_replace_callback—执行一个正则表达式搜索并且使用一个回调进行替换mixedpreg_replace_callback(mixed$pattern,callable$callback,mixed$subject[,int$limit=-1[,int&$count]])这个函数的行为除了可以指定一个callback替代replacement进行替换字符串的计算,其他方面等同于preg_replace()。pattern:要搜索的模式,可以使字符串或一个字符串数组。callback:一个回调函数,在每次需要替换时调用,调用时函数得到的参数是从subject中匹配到的结果。回调函数返回真正参与替换的字符串。你可能经常会需要callback函数而仅用于preg_replace_callback()一个地方的调用。在这种情况下,你可以使用匿名函数来定义一个匿名函数作为preg_replace_callback()调用时的回调。这样做你可以保留所有调用信息在同一个位置并且不会因为一个不在任何其他地方使用的回调函数名称而污染函数名称空间。subject:要搜索替换的目标字符串或字符串数组。limit:对于每个模式用于每个subject字符串的最大可替换次数。默认是-1(无限制)。count:如果指定,这个变量将被填充为替换执行的次数。示例:preg_replace_callback()和create_function():
复制代码代码如下:
|
|