<?php
/*	速查:
		\d	数字		0-9				(digit)
		\s	任一空格	\n\r\t\f		(space)
		\w	表示一个字	a-zA-Z0-9_		(word)
		.	表示任一字符(除换行符)
		
		*	0或多次
		+	1或多次
		
		i	不区分大小写
		U	取消贪婪模式
		
		()	作用:
			1.大原子
			2.改变优先级
			3.子模式(在括号中的最前面加?:取消子模式)
			
	在PHP中给我们提供两套正则表达式函数库
	POSIX 扩展正则表达式函数(ereg_)
	Perl 兼容正则表达式函数(preg_)

	注意:推荐使用Perl 兼容正则表达式函数库(只学这一种)

//==================================================================
//--------------------一、正则表达式的模式如何编写----------------
//------------------------1. 定界符号  // --------------------------
除了字母、数字和正斜线\ 以外的任何字符都可以为定界符号
	| |		/ /		{ }		! !
通常使用正斜线作“//”为正则表达式的定界符号
//------------------------------------------------------------
//------------------------2. 原子   img \s . -----------------
注意:原子是正则表达式的最基本组成单位,且必须至少要包含一个原子
原子:一个正则表达式可以单独使用的字符

1. 原子包括所有打印(所有可以在屏幕上输出的字符串)和非打印
	字符(看不到的)

2. " \ "转义字符可将有意的字符转成没意义的字符,
	还可将没意义的字符转为有意义的字符
	如:\. \* \+ \? \( \<\> 
	
3. 在正则表达式中可以直接使用一些代表范围的原子
	\d	一个十进制的数字							[0-9]
	\D	一个除数字这外的字符						[^0-9]
	\s	一个空白字符,空格、\n\r\t\f				[\n\r\t\f]
	\S	一个非空白									[^\n\r\t\f]
	\w	一个字 a-zA-Z0-9_							[a-zA-Z_]
	\W	除了a-zA-Z0-9_ 以外的任意一个字符			[^a-zA-Z0-9_]
	\b	单词边界
	\B	非单词边界
	
4. 自己定义一个原子表[], 可以匹配方括号中的任何一个原子
	[a-z5-8] [*+.](括号中特殊字符可转意可不转意,最好转意)
	[^a-z]	^ 表示取反,就是除了原子表中的原子,都可以表示
	^ 必须在 [] 内的第一个字符处出现

//------------------------------------------------------------
//--------------------------3. 元字符  * ? -------------------
元字符是一种特殊的字符,是用来修饰原子用的,不可以单独出现

表示其前的面原子可以出现的次数:
	*	0次和任意次		{0,}
	+	1次以上			{1,}
	?	0次或1次		{0,1}
	
{}	用于自己定义前面原子出现的次数:
	{m}		m次(精确的)
	{m,n}	m到n次,包括m和n
	{m,}	m到无限
	
.	表示任意 一个 字符(除换行符)
^	必须以某个内容开始(^ 放在表达式开头)
$	必须以某个内容结束($ 放在表达式结尾)
|	表或的关系 优先级最低

\b  : 表示一个边界
\B  : 表示一个非边界

括号 () 
	一、将正则括起表示大原子
	二、加上括号可以提高优先级别
	三、作为子模式使用:
		全部匹配作为一个大模式,放到数组的第一个元素中。
		每个 () 匹配的是一个子模式按顺序放到数组的其它元素中去。
	四、 (?:  ) 可以取消子模式,括号只改变优先级 “?:”放在最前面
	五、反向引用,取出子模式,作为表达式模式的一部分,如果是在正
	则表达式像替换函数 preg_replace 函数中,可以将子模式取出,在
	被替换的字符串中使用
	\1 取第一个子模式
	\2 取第二个子模式 ....  
	
	"\\1"	'\1'	注意是单引号还是双引号引起来的正则
示例:
	$patterns = "/\<a\s*href=\'(.*\.html).*\>(.*)\<\/a\>/iU";
	$replacements = "<a href=\"http://www.dy2018.com\\1\">\\2</a><br>";
	$string = file_get_contents("http://www.dy2018.com");
	preg_match_all($patterns,$string,$arr);
	$string = implode('',$arr[0]);
	echo preg_replace($patterns,$replacements,$string);
	
	${1} ${2}		不可在本身使用
	\* \+ \. \?
	
	优先级
		1.	\
		2.	()	(?:)	[]
		3.	*	+ 	?	{}
		4.	^	$	\b
		5.	|
//-------------------------------------------------------------------
//-----------------------4. 模式修正符号 i u------------------------
模式修正符作用:
	"/ /模式修正符"
	1. 就是几个字母
	2. 可以一次使用一个,每一个具一定的意义, 也可以连续使用多个
	3. 是对整个正则表达式调优使用, 也可以说是对正则表达式功能的扩展

	"/abc/" 只能匹配小写字母 abc
	"/abc/i" 可以不区分大小写匹配 ABC abc Abc ABc AbC

	i	不区分大小写
	m	将字符串视为一行 (在使用 ^ 或 $ 时,任何一行都可以以该正则开始或结束)
	s	元字符中的"."默认不能表示换行符号将字符串视为单行。使用后则也可以表示换行符
	x	空白忽略不计
	e	在使用 preg_replace 时,内部可以使用函数
		如: preg_replace("/[a-z]/e",'strtoupper("\1")',$str,11);
A : 同^
D : 同$
U : 取消贪婪模式。
	
	取消贪婪模式(两种方法勿同时使用,否则作用抵消)
		一种使用模式修正符号 U 
		一种是使用?完成  .*?  .+?
		
"/\<img\s*src=\".*?\"\/\>/iU"
"#\<img\s*src=\".*?\"\/\>#iU"

/原子和元字符/模式修正符号   / 为定界符号 (有一些语言是不需要这个定界符号)

有些语言中不支持模式修正符号如:javascript
*/
//=======================================================================
//--------------------二、学习正则表达式的强大处理函数-----------------
// 1. 字符串的匹配与查找
str_replace( 要替换的值, 替换为的值, 被搜索的字符串, [ 替换次数])
str_replace(string, string, string)
str_replace(array, string, string)
str_replace(array, array, string)
str_replace()
str_ireplace()  //不区分大小写
//-----------------------------------------------------------------------
//-----------------------------------------------------------------------
preg_match_all		//"匹配全局 preg_match_all(正则,字符串,数组,PREG_PATTERN_ORDER);"
					//"模式 PREG_PATTERN_ORDER  PREG_SET_ORDER "
preg_match			//"匹配 preg_match(正则,字符串,数组:匹配出的信息);"
preg_replace			//"替换 preg_replace(正则,要替换为的字符串,要匹配的字符串,[要替换的次数]);"
preg_replace_callback//用回调函数执行正则表达式的搜索和替换
preg_split			//"分割 preg_split(正则:要分割的各种符号,要分割的字符串)"
preg_quote			//"preg_quote(要转义的字符串,[分隔符]) 转义正则表达式字符,自动将正则符号加转意字符"
preg_grep			//"返回与模式匹配的数组单元 preg_grep(正则,数组)"
//=============================替换==================================
//------------------------preg_replace 例----------------------------
//字符串 
$string = "Name: {Name}< br>\nEmail: {Email}< br>\nAddress: {Address}< br>\n"; 
//模式 
$patterns =array(
"/{Address}/",
"/{Name}/",
"/{Email}/"
); 
//替换字串 
$replacements = array (
"No.5, Wilson St., New York, U.S.A",
"Thomas Ching",
"tom@emailaddress.com",
);
//输出模式替换结果 
echo preg_replace($patterns, $replacements, $string); 
//=======================抓取网页链接并替换==================
//--------------------------------方法1-----------------------
$patterns="/\<a\s*href=\'(.*\.html).*\>(.*)\<\/a\>/iU";
$replacements="<a href=\"http://www.dy2018.com\\1\">\\2</a><br>";

$string=file_get_contents("http://www.dy2018.com");
preg_match_all($patterns,$string,$arr);
$string=implode('',$arr[0]);
echo preg_replace($patterns,$replacements,$string);
//------------------------------------------------------------
//-------------------------------方法2------------------------
$patterns="/\<a\s*href=\'(.*\.html).*\>(.*)\<\/a\>/iU";
$string=file_get_contents("http://www.dy2018.com");
preg_match_all($patterns,$string,$arr);
for($i=0;$i<=330;$i++){
	echo "<a href=\"http://www.dy2018.com".$arr[1][$i]."\">".$arr[2][$i]."</a><br>";
}
//------------------------------------------------------------
//--------------------------抓取汉字--------------------------
$str="vbfyh汉字汉字vfj";

//GBK/GB2312编码:[x80-xff>] 或 [xa1-xff]
preg_match_all("/[^xa1-xff]{2,}/", $str, $arr);

//UTF-8编码:[x{4e00}-x{9fa5}]
preg_match_all("/[^x4e00-x9fa5]{2,}/", $str, $arr);
//============================================================
//------------------------匹配微博评论-----------------------
$string = 'bgjf@dbngj@gtur@c你b_好<img src="vnfjgn.jpg">@雅蠛蝶';

/* 匹配字母、下划线、还有utf8的中文 */
$regEx = "/@[a-zA-Z0-9_\x{4e00}-\x{9fa5}]+/u";
preg_match_all($regEx,$string,$arr);
//============================================================
//------------------正则替换是有先后顺序的-------------------
$string = 'ThinkPHP  ,,,框和架 limit() 方法的或用法详解';
$string = trim($string);
// 正则替换是有先后顺序的,数组的第一个先替换
$reg = array(
	"/\s+/",
	'/,{2,}/',
	'/的/',
);
$replace = array(
	',',
	',',
	','
);
echo  preg_replace($reg,$replace,$string);
//============================================================
//------------------------------------------------------------