PHP正则表达式
随堂练习
正则
什么是正则表达式
正则表达式就是一套专门用于处理文本的强大工具,可以对进行文本查找,匹配,替换;
正则表达式常用于验证表单提交的内容,比如验证电话号码,Email地址,身份证号码等是否有效;
Perl风格
PCRE全称为Perl Compatible Regular Expression,意思是Perl兼容正则表达式。
Perl兼容的正则表达式必须包含在定界符中,除数字、字幕、反斜线外的任何字符后可以作为定界符,
另外,如果定界符要出现在表达式中需要使用转义符转义
Perl 兼容正则表达式函数
preg_match
进行正则表达式匹配
preg_match("/hello/", "hello world", $res);
var_dump($res);
// 输出结果:
array(1) {
[0]=>
string(5) "hello"
}
preg_match_all
匹配全局正则表达式匹配
preg_match_all("/h/", "hello hello", $res);
var_dump($res);
// 输出结果:
array(1) {
[0]=>
array(2) {
[0]=>
string(1) "h"
[1]=>
string(1) "h"
}
}
preg_replace
执行正则表达式的搜索和替换
$res = preg_replace("/hello/","aaaa","hello world");
var_dump($res);
// 输出结果:
string(10) "aaaa world"
preg_split
用正则表达式分割字符串
$str = 'hypertext hanguage hrogramming';
$chars = preg_split('/ /', $str);
var_dump($chars);
// 输出结果:
array(3) {
[0]=>
string(9) "hypertext"
[1]=>
string(8) "hanguage"
[2]=>
string(11) "hrogramming"
}
元字符(特殊字符)
*
匹配前面的字符零次或多次,等同于
{0,}
preg_match("/a*/","bbbbbaaa",$res);
var_dump($res);
// 输出结果:
array(1) {
[0]=>
string(0) ""
}
+
匹配前面的字符一次或多次,等同于
{1,}
preg_match('/a+/','bbbbbbbbbbaa',$res);
var_dump($res);
// 输出结果:
array(1) {
[0]=>
string(2) "aa"
}
?
匹配前面的字符零次或一次,等同于
{0,1}
preg_match("/a?/","aaaabbbb",$res);
var_dump($res);
// 输出结果:
array(1) {
[0]=>
string(1) "a"
}
|
匹配两个或多个选择
preg_match("/(h|a)+/","dfghsssssasfgdsf",$res);
var_dump($res);
// 输出结果:
array(2) {
[0]=>
string(1) "h"
[1]=>
string(1) "h"
}
^
匹配字符串的开始位置
preg_match("/^hello/","hello world",$res);
var_dump($res);
// 输出结果:
array(1) {
[0]=>
string(5) "hello"
}
$
匹配字符串结束位置
preg_match("/^hello world$/","hello world",$res);
var_dump($res);
// 输出结果:
array(1) {
[0]=>
string(11) "hello world"
}
\b
匹配单词的边界(如空格、横杠,但不包括下划线) 更简单点说
\b
匹配特殊字符
preg_match("/hello\b/","hello-world",$res);
var_dump($res);
// 输出结果:
array(1) {
[0]=>
string(5) "hello"
}
\B
匹配除单词边界以外的部分 更简单点说
\B
匹配除了特殊字符以外的字符
preg_match("/hello\B/","hello_world",$res);
var_dump($res);
// 输出结果:
array(1) {
[0]=>
string(5) "hello"
}
[]
匹配方括号中的任一字符
preg_match("/[abcdf]/","aaaa - bbbb - aaac",$res);
var_dump($res);
// 输出结果:
array(1) {
[0]=>
string(1) "a"
}
[^]
匹配除方括号中的字符外的任何字符
preg_match("/[^abcdf]/","asd",$res);
var_dump($res);
// 输出结果:
array(1) {
[0]=>
string(1) "s"
}
{m}
m 是一个非负整数。匹配确定的 m 次
preg_match('/\d{5}/','123456789',$res);
var_dump($res);
// 输出结果:
array(1) {
[0]=>
string(5) "12345"
}
{m,}
m 是一个非负整数。至少匹配m 次
preg_match('/\d{3,}/','123456789',$res);
var_dump($res);
// 输出结果:
array(1) {
[0]=>
string(9) "123456789"
}
{m,n}
最少匹配 m次且最多匹配 n次
preg_match('/\d{3,8}/','123456789',$res);
var_dump($res);
// 输出结果:
array(1) {
[0]=>
string(8) "12345678"
}
()
表示一个整体
preg_match('/订单收款(.*)元/','订单收款900元',$res);
var_dump($res);
// 输出结果:
array(2) {
[0]=>
string(18) "订单收款900元"
[1]=>
string(3) "900"
}
.
匹配除换行之外的任何一个字符
preg_match('/.*/','123456789',$res);
var_dump($res);
// 输出结果:
preg_match('/.*/','123456789',$res);
var_dump($res);
预定义元字符
由于某些模式会反复用到,所以可以使用以下预定义类;
\d
匹配一个数字;等价于
[0-9]
preg_match("/\d+/","asdasdasdad 3434",$res);
var_dump($res);
// 输出结果:
array(1) {
[0]=>
string(4) "3434"
}
\D
匹配除数字以外任何一个字符;等价于
[^0-9]
preg_match("/\D+/","asdasdasdad 3434",$res);
var_dump($res);
// 输出结果:
array(1) {
[0]=>
string(13) "asdasdasdad "
}
\w
匹配一个英文字母、数字或下划线;等价于
[0-9a-zA-Z_]
preg_match("/\w+/","asdasdasdad 3434",$res);
var_dump($res);
// 输出结果:
array(1) {
[0]=>
string(11) "asdasdasdad"
}
\W
匹配除英文字母、数字和下划线以外任何一个字符;等价于
[^0-9a-zA-Z_]
preg_match("/\W+/","asdasdasdad 3434",$res);
var_dump($res);
// 输出结果:
array(1) {
[0]=>
string(2) " "
}
\s
匹配一个空白字符;等价于
[\f\n\r\t\v]
preg_match("/\s+/","asdasdasdad 3434",$res);
var_dump($res);
// 输出结果:
array(1) {
[0]=>
string(2) " "
}
\S
匹配除空白字符以外任何一个字符;等价于
[^\f\n\r\t\v]
preg_match("/\S+/","asdasdasdad 3434",$res);
var_dump($res);
// 输出结果:
array(1) {
[0]=>
string(11) "asdasdasdad"
}
匹配包含某个范围的字符
用"[start-end]"匹配包含某个范围的字符
[a-z] 匹配所有的小写字母
[A-Z] 匹配所有的大写字母
[a-zA-Z] 匹配所有的字母
[0-9] 匹配所有的数字
[0-9\.\-] 匹配所有的数字,句号和减号
preg_match("^[a-z]+$^", "abc",$res);
var_dump($res);
// 输出结果:
array(1) {
[0]=>
string(3) "abc"
}
模式修正符
模式修正符在正则表达式定界符之外使用
i
在和模式进行匹配时不区分大小写
preg_match("/hello/i","HELLO WORLD",$res);
var_dump($res);
m
将字符串视为多行
$str = 'bcd
abc
cba';
preg_match_all('/^abc/m',$str,$arr);
var_dump($arr);
s
模式中的圆点元字符
.
将匹配所有的字符,包括换行符
$str = 'adsadsa
c';
preg_match_all('/a.*c/s',$str,$arr);
var_dump($arr);
x
模式中的空白忽略不计,除非已经转义
preg_match_all("/^ hello /x","hello",$res);
var_dump($res);
U
取消贪婪匹配
$pattern = '/<b>.*<\/b>/U';
$string = '<b>hello</b> <b>world</b> <b>php</b>';
preg_match($pattern,$string,$res);
var_dump($res);
常用的正则表达式
手机号验证
<?php
//正则表达式
header("Content-Type:text/html;charset=utf-8");
$tel = "13055859966";
//上面部分判断长度是不是11位
if (strlen($tel) == "11") {
$reg = "/^((13[0-9])|(14[5,7])|(15[0-3,5-9])|(17[0,3,5-8])|(18[0-9])|166|198|199|(147))\\d{8}$/";
if (!preg_match($reg, $tel)) {
echo "手机号不正确";
}else {
echo "手机号正确";
}
} else {
echo "长度必须是11位";
}
?>
邮政验证
<?php
//正则表达式
header("Content-Type:text/html;charset=utf-8");
$email = '17171226@qq.com';
if (!preg_match('/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/', $email)) {
echo "邮箱不合法";
}else {
echo "邮箱合法";
}
?>
url验证
<?php
$url = 'https://www.baidu.com';
$url = strtolower(trim($url ));
if(empty($url )) {
echo "url格式不正确";
}
$match = '/^(http:\/\/)?(https:\/\/)?([\w\d\-]+\.)+[\w\-]+(\/[\d\w\-.\/?%&=]*)?$/';
if (!preg_match($match, $url)) {
echo "url格式不正确";
}else{
echo "url格式正确";
}
?>
用户名验证
<?php
//6-20位字符,必须以字母开头,只能包含数字、字母、下划线,不区分大小写
$username = "user11";
$match = '/^[a-zA-Z_][a-zA-Z0-9-_]{5,19}$/';
if (!preg_match($match, $username)) {
echo "用户名格式不正确";
}else{
echo "用户名格式正确";
}
?>
密码验证
<?php
//6-16位字符,需包括数字与英文字母
$pwd = "ddkjs3322";
$match = '/^(?![0-9]+$)(?![a-z]+$)(?![A-Z]+$)(?!([^(0-9a-zA-Z)])+$).{6,16}$/';
if (!preg_match($match, $pwd)) {
echo "密码格式不正确";
}else{
ehco "密码正确";
}
?>
用正则表达式采集网站上的图片
采集图片的网址:http://desk.zol.com.cn/qiche/
用正则表达式采集小说网站的小说
采集小说的网址:http://book.zongheng.com/showchapter/984807.html
注意:有些网站防止恶意的访问,当某IP过于频繁访问该网站时会弹出验证码的窗口,验证是否是机器人。
上面的小说采集的案例里的网站就有这个验证,当出现采集不了时,那有可能触发到该验证了