PHP正则表达式大全
我自己常用的正则表达式:
<? //s无视换行符,i不区分大小写 $data='<span>123</span> <span> 456</span> <Span> 789 </span>'; preg_match_all('/<span>(.*?)<\/span>/isx',$data,$str); print_r($str);
正则表达式的主要作用
分割、匹配、查找、替换
正则表达式函数
preg_grep($mode,$str) //匹配查找,返回一个数组; preg_match($mode,$str,$return) //在字符串中查找匹配项,返回一个数组。 preg_match_all($mode,$str,$return [,int flags]) preg_split($mode,$str [,int limit 切割多少次 [,int flags] ] ) //使用正则表达式分割字符串,并将结果以数组的形式返回(类似explode)。 preg_replace($mode,$replacement,$str [,int limit 匹配多少次]) //查找和替换子字符串(类似str_replace) preg_quote($str) //在每个正则表达式的特殊字符前面加入一个转义字符(反斜线“\”),正则表达式的特殊字符包括:.\\+*?[^]$(){}=!<>|:
正则表达式中包括的元素
原子(普通字符:a-z A-Z 0-9 、原子表、转义字符)
元字符(有特殊功能的字符)
模式修正符(系统内置部分字符 i 、m、S、U…)
转义字符
\d 包含所有数字 [0-9]
\D 除所有数字外 [^0-9]
\w 包含所有字符(大小写英文字母、下划线、数字) [a-zA-Z_0-9]
\W 除所有字符(大小写英文字母、下划线、数字)外 [^a-zA-Z_0-9]
\s 空白区域如回车、换行、分页等 [\f\n\r]
\S 非空白区域如回车、换行、分页等 [^\f\n\r]
元字符
. 匹配任意次但不包含回车换行
* 匹配任意次
? 匹配 0 次或 1 次
+ 匹配 1 次或多次
| 选择匹配(或者)
^ 匹配开头(方括号中表示非)
$ 匹配尾部
{m} 匹配前一个内容的重复次数为 m 次
{m,} 匹配前一个内容的重复次数大于等于 m 次
{m,n} 匹配前一个内容的重复次数 m 次到 n 次
( ) 合并整体匹配,并放入内存,可使用 \1 \2… 依次获取
模式修正符: 【/ 正则 / U 】
小写i 不区分大小写
小写m 匹配首内容或尾内容时采用多行识别匹配
小写s 将转义回车取消视为单行匹配
小写x 忽略正则中的空白
大写A 强制从头开始匹配
大写D 强制 $ 匹配尾部无任何内容
大写U 禁止贪婪匹配,只跟踪到最近的一个匹配符并结束,常用在采集程序
小写u 匹配中文
解题方法总结:
1. 先写出一个要匹配的字符串
2. 自左向右的顺序使用正则表达式的原子和元字符拼接
3. 加入模式修正符
常用正则
//删除一对中括号内的内容: $str = 'abc[url]123[/url]xyz'; $pattern = '/\[url\S*\[\/url\S*\]/'; $str = preg_replace($pattern, '', $str); echo $str . ''; //输出:abcxyz //PHP匹配多对中括号中的内容: $str = '这是[3]def[25]我的[26]'; $pattern = '/\[([a-z0-9]+)\]/'; preg_match($pattern, $str, $match); print_r($match); //匹配所有大括号里面的内容: $str = 'abc{title}def{author}mn'; $pattern = '/{(.*)}/U'; preg_match($pattern, $str, $match); print_r($match); //匹配网页源代码中的图片路径: $str = '<img alt="标题" id="pic" src="http://test.cn/avatar.jpg" />'; $pattern = '/<img.*?src="(.*?)".*?\/?>/i'; preg_match($pattern,$str,$match); print_r($match); //匹配当前页面的所有超链接: $str = '<a href="http://www.test.com/a.html">跳转</a>'; $pattern = '/<a(.*?)href="(.*?)"(.*?)>(.*?)<\/a>/i'; preg_match($pattern, $str, $match); print_r($match); //匹配邮件 $str = '12345@qq.com'; $pattern = "/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,})$/i"; preg_match($pattern, $str, $match); print_r($match); //匹配11位手机号: $str = '13299803211'; $pattern = "/^1(3|5|8)\d{9}$/"; preg_match($pattern, $str, $match); print_r($match); //匹配139开头的11位手机号码 $str = '13912345678'; $pattern = '/^139\d{8}$/'; preg_match($pattern,$str,$match); print_r($match); //UTF-8编码下提取字符串中的中文: $str = 'hello 中文 byebye'; $pattern = '/[\x{4e00}-\x{9fa5}]+/u'; preg_match($pattern, $str, $match); print_r($match); //“中文” //替换字符串中的中文为空 $res = preg_replace($pattern,'',$str); echo $res.’'; //分割中文字符串为等长度元素的数组(英文可以用str_split,但中文会乱码) $str = '中文字符串'; $res = preg_split('/(?<!^)(?!$)/u', $str); print_r($res); //过滤网页上的所有script标记 $str = '<script type="text/javascript" src="dd.js">alert(123);</script><p style="color: red">测试php正则匹配掉js代码</p>'; $pattern = "/<script[\s\S]*?<\/script>/i"; //过滤JS标签 $pattern = "/<[\/\!]*?[^<>]*?>/si"; //过滤HTML标签 $res = preg_replace($pattern, "", $str); echo $res.’'; //替换<b>标签为空 $str = '<b>abc</b><b>abc</b>'; $pattern = '/<b>(.*?)<\/b>/'; $res = preg_replace($pattern,'\\1',$str); echo $res.'';
评论
发表评论: