PHP 正则表达式
Posted 满眼都是她
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP 正则表达式相关的知识,希望对你有一定的参考价值。
正则表达式的主要作用是:分割、匹配、查找、替换
正则表达式中包括的元素:
原子(普通字符: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:匹配中文
Perl正则表达式函数:
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) //在每个正则表达式的特殊字符前面加入一个转义字符(反斜线“\\”),正则表达式的特殊字符包括:.\\\\+*?[^]$(){}=!<>|:
【常用正则表达式】
//删除一对中括号内的内容:
$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.\'\';
以上是关于PHP 正则表达式的主要内容,如果未能解决你的问题,请参考以下文章
正则表达式匹配特定的 URL 片段而不是所有其他 URL 可能性