<?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);
//============================================================
//------------------------------------------------------------RegEx.php
选择阅读主题色