最近做了一个微薄系统,处理博文经常需要处理很复杂的字符串,虽然正则相对于php的其它函数的效率是比较低的,但是确实是最有效的。哎,没办法只好把php的正则表达式好好复习一下了。 php常用的正则函数主要是以preg开头,主要有以下几个函数: 1,preg_grep 2,preg_match 3,preg_match_all 4,preg_quote 5,preg_replace 6,preg_repalce_callback 7,preg_spilt preg_grep -- 返回与模式匹配的数组单元 preg_grep 返回一个input 数组中与给定的 pattern 模式相匹配的单元所组成的数组。 例子1.1 <?php $arr = array('a','1',4,'8','cd','g'); $array = preg_grep ("/^(\d)+$/", $arr);// 返回所有数字元素。 print_r($array); ?> 返回:Array ( [1] => 1 [2] => 4 [3] => 8 ) preg_match -- 进行正则表达式匹配 说明:int preg_match ( string pattern, string subject [, array matches [, int flags]] )在 subject 字符串中搜索与 pattern 给出的正则表达式相匹配的内容。 返回值0或1。 例子2.1 <?php echo preg_match ("/^hello/i", "zhe shi hello World"); //字符串是否以hello开头,echo 0 echo preg_match ("/^hello/i", "hello World"); //字符串是否以hello开头,echo 1 ?> 返回01 preg_match_all -- 进行全局正则表达式匹配 说明:int preg_match_all ( string pattern, string subject, array matches [, int flags] )在 subject 中搜索所有与 pattern 给出的正则表达式匹配的内容并将结果以 flags 指定的顺序放到 matches 中。 返回数组。 例子3.1 <?php $html = "<b>bold text</b><a href=howdy.html>click me</a>"; preg_match_all ("/(<([\w]+)[^>]*>)(.*)(<\/\\2>)/", $html, $matches); print_r($matches); ?> 返回: Array ( [0] => Array ( [0] => <b>bold text</b> [1] => <a href=howdy.html>click me</a> ) [1] => Array ( [0] => <b> [1] => <a href=howdy.html> ) [2] => Array ( [0] => b [1] => a ) [3] => Array ( [0] => bold text [1] => click me ) [4] => Array ( [0] => </b> [1] => </a>) ) 改正则一共匹配两次,其中第一次匹配结果放在$matches[$i][0]中,第二次匹配结果放在$matches[$i][1]中,其中$matches[0]表示匹配的字符串,$matches[1]表示匹配第一个小括号中的模式既:(<([\w]+)[^>]*>),$matches[2]表示匹配第二个小括号中的模式既:([\w]+),$matches[3]表示匹配第三个小括号中的模式既:(.*),$matches[4]表示匹配第四个小括号中的模式既:(<\/\\2>)【注:\\2 是一个逆向引用的 上面我已经讲了preg_grep,preg_match,preg_match_all三个函数的用法,下面我在讲一讲另外四个函数的用法。 preg_quote -- 转义正则表达式字符 说明:string preg_quote ( string str [, string delimiter] )preg_quote() 以 str 为参数并给其中每个属于正则表达式语法的字符前面加上一个反斜线。如果你需要以动态生成的字符串作为模式去匹配则可以用此函数转义其中可能包含的特殊字符。 例子4.1 <?php $s = "This's a test,'ha ha'"; $s = preg_quote ($s, "'"); echo $s; ?> 返回:This\'s a test,\'ha ha\' preg_replace -- 执行正则表达式的搜索和替换 mixed preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit] )在 subject 中搜索 pattern 模式的匹配项并替换为 replacement。如果指定了 limit,则仅替换 limit 个匹配,如果省略 limit 或者其值为 -1,则所有的匹配项都会被替换。 例子5.1 <?php $string = "2010-10-11"; $pattern = "/(\d+)-(\d+)-(\d+)/i"; $replacement = "\${2},\${3} \${1}"; print preg_replace($pattern, $replacement, $string); ?> 返回:10,11 2010 preg_split -- 用正则表达式分割字符串 说明:array preg_split ( string pattern, string subject [, int limit [, int flags]] )返回一个数组,包含 subject 中沿着与 pattern 匹配的边界所分割的子串。 例子6.1 <?php $str = 'hypertext language programming'; $chars = preg_split('/ /', $str, -1, PREG_SPLIT_OFFSET_CAPTURE); //以空格为分隔符 print_r($chars); ?> 返回:Array ( [0] => Array ( [0] => hypertext [1] => 0 ) [1] => Array ( [0] => language [1] => 10 ) [2] => Array ( [0] => programming [1] => 19 ) ) preg_replace_callback -- 用回调函数执行正则表达式的搜索和替换 说明:mixed preg_replace_callback ( mixed pattern, callback callback, mixed subject [, int limit] )本函数的行为几乎和preg_replace一样,除了不是提供一个 replacement 参数,而是指定一个 callback 函数。该函数将以目标字符串中的匹配数组作为输入参数,并返回用于替换的字符串。 <?php $text = "Fri Dec 25 13:07:17 +0800 2009"; function call_back($matches) { $arr = array('Jan ','Feb','Mar','Apr','May','Jun','Jul','Aug','Sept','Oct','Nov','Dec'); $r_arr = array('1','2','3','4','5','6','7','8','9','10','11','12'); $date_time = str_replace($arr,$r_arr,$matches['2']); return $matches[6].'-'.$date_time.'-'.$matches[3].' '.$matches[4]; } echo preg_replace_callback( "|(\w+)\s(\w+)\s(\w+)\s([\w:]+)\s([\w\+]+)\s(\w+)|", "call_back",$text); ?> 返回:2009-12-25 13:07:17