现在的位置: 首页 > 综合 > 正文

正则表达式学习 二(常用函数详解)

2012年10月21日 ⁄ 综合 ⁄ 共 2769字 ⁄ 字号 评论关闭

去网上连搜带刮,终于给理解了大概~\(≧▽≦)/~啦啦啦

<?php
//preg_match()
//int preg_match ( string pattern, string subject [, array matches [, int flags]] )
//在 subject 字符串中搜索与 pattern 给出的正则表达式相匹配的内容。 
//如果提供了 matches,则其会被搜索的结果所填充。$matches[0] 将包含与整个模式匹配的文本,$matches[1] 将包含与第一个捕获的括号中的子模式所匹配的文本,以此类推。
//preg_match() 返回 pattern 所匹配的次数。要么是 0 次(没有匹配)或 1 次,因为 preg_match() 在第一次匹配之后将停止搜索。preg_match_all() 则相反,会一直搜索到 subject 的结尾处。如果出错 preg_match() 返回 FALSE。 
//
//preg_match_all()
//int preg_match_all ( string pattern, string subject, array matches [, int flags] )
//在 subject 中搜索所有与 pattern 给出的正则表达式匹配的内容并将结果以 flags 指定的顺序放到 matches 中。 
//搜索到第一个匹配项之后,接下来的搜索从上一个匹配项末尾开始。 




//mixed preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit] )
//在 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 只是单纯的文字。 


//1.进行字符串的查找的替换
         $str         = "daoyu shi ge hao hai zi 5555";
         $pattern     = "/\s/";           //如果将变量定义为$pattern_1会出错
         $str               = preg_replace($pattern,'-',$str);
         echo $str."<br>";
//daoyu-shi-ge-hao-hai-zi-5555
//2.对字符串的逆向引用
//方法一
         $pat         = "/(\w+)-(\w+)-(\w+)-(\w+)-(\w+)-(\w+)-(\d+)/i";
         $str         =preg_replace($pat,"\$1",$str);
         echo $str."<br>";


//注意:如果是下面这种形式你会发现匹配的是:zi- 所以可以这样认为在有次数的{6}的情况下,他($1)匹配的是最后一次
         $str='daoyu-shi-ge-hao-hai-zi-5555';
         $pat         = "/((\w+)-){6}(\d+)/i";
         $str         =preg_replace($pat,"\$1",$str);
         echo $str."<br>";


//方法二
         $str         = "daoyu-shi-ge-hao-hai-zi-5555";
         $pat         = "/(\w+)-(\w+)-(\w+)-(\w+)-(\w+)-(\w+)-(\d+)/i";        
         $str         =preg_replace($pat,"\\1",$str);
         echo $str."<br>";


//注意:当正则写成$pat= "/((\w+)-){6}(\d+)/i";时和上面的情况一样
//3 当参数是数组的情况(用下手册的例子)
         $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)."<br>";

//或许你已经发现了,他是按“将以其键名在数组中出现的顺序来进行处理。这不一定和索引的数字顺序相同”按我的理解就是在按“写”的顺序而这并不一定是//索引的顺序(书册上还有还有ksort()后的例子,时间关系就不说了,有兴趣的兄弟可以自己找着看下)
//如果 subject 是个数组,则会对 subject 中的每个项目执行搜索和替换,并返回一个数组。
//如果 pattern 和 replacement 都是数组,则 preg_replace() 会依次从中分别取出值来对 subject 进行搜索和替换。如果 replacement 中的值比 pattern 中的少,则用空字符串作为余下的替换值。如果 pattern 是数组而 replacement 是字符串,则对 pattern 中的每个值都用此字符串作为替换值。反过来则没有意义了。

//preg_split
//array preg_split ( string pattern, string subject [, int limit [, int flags]] )
//返回一个数组,包含 subject 中沿着与 pattern 匹配的边界所分割的子串。 
//如果指定了 limit,则最多返回 limit 个子串,如果 limit 是 -1,则意味着没有限制

	$seek  = array();
	$text   = "I have a dream that one day I can make it. So just do it, nothing is impossible!";	
	//将字符串按空白,标点符号拆分(每个标点后也可能跟有空格)
	$words = preg_split("/[.,;!\s']\s*/", $text);
	foreach($words as $val)
	{
		$seek[strtolower($val)] ++;
	}

	echo "共有大约" .count($words). "个单词。";
	echo "其中共有" .$seek['i']. "个单词“I”。";
?>

抱歉!评论已关闭.