正则表达式在php中的基本使用

正则表达式的基本是使用

一、正则表达式的简介和分类

正则表达式是一种表述字符串结构的语法规则,是一个特定的格式模式。可以匹的字串。配、替换、截取匹配
在PHP中支持两套正则表达式的处理函数库,一套是PCRE库提供,一套是POSIX扩展语法的正则表达式。但是PCRE提供的正则表达式效率略占优势。

二、正则表达式字符串构成

正则表达式描述了一种字符串匹配的模式,通过这个模式在特定的函数中对字符串进行匹配、查找、替换以及分割等操作。

1. 位置元字符

行定位符就是用来描述字符串的边界。
“^” 表示行的开始

$str="1pple";
$reg='/^a/';//匹配字符串以a作开头  正则表达式
var_dump(preg_match($reg,$str));//执行匹配正则表达式

“$” 表示行的结束

//位置元字符 $ 以谁为结尾
$reg1='/e$/';
var_dump(preg_match($reg1,'apple'));
2. 字符串元字符

这些字符用来描述一类或者一组字符
A.[ ] 字符类 一个括号只能匹配一个字符。[0-9][a-zA-Z]

//匹配一个字符 从x|X中任选一个
$reg5='/^[x|X]$/';//匹配从x或X中任选一个
var_dump(preg_match($reg5,'x'));

B.()选择字符

$reg6='/^(X|x|M|m)$/';
var_dump(preg_match($reg6,'M'));

C. - 连字符
D.[^]排除字符
E.(.)任意字符

//. 匹配任意一个字符
$reg7='/^a.p$/';//以a为开头  以p为结尾  中间包含任意一位字符串
var_dump(preg_match($reg7,'aep'));

F.()转译字符

//转义字符  .在正则表达式中本来有特殊的函数  \.代表的就是普通字符
/*.html*/
$ref8='/.html$/';
var_dump(preg_match($ref8,'phtml'));
$reg8='/\.html$/';
var_dump(preg_match($reg8,'.html'));

E | 或

$pre4='/^a(b|c)D$/';
var_dump(preg_match($pre4,'acD'));

G.正则表达式中,有些字符本身没有特殊含义,前面加上\ 就具有特殊意义。
\d 任意十进制数 代表的是【0-9】
//\d 匹配任意十进制字符 [0-9]

$reg10='/^[0-9]$/';
var_dump(preg_match($reg10,'1'));
$reg11='/^\d$/';
var_dump(preg_match($reg11,'1'));

\D 任意非十进制数 代表是【^0-9】

//\D任意非十进制 [^0-9] 除了0-9之间的任意一个
$reg12='/^\D$/';
var_dump(preg_match($reg12,'a'));
  \s 任意空白字符     代表空格
//\s匹配空格
$reg13='/^\s$/';
var_dump(preg_match($reg13,' '));

\S 任意非空白字符

//\S 任意非空白字符
$reg14='/^\S$/';
var_dump(preg_match($reg14,'%'));

\w 任意单词字符(数字字母_)

$preg9='/^\w$/';//任意单词字符 数字字母下划线
echo preg_match($preg9,'-');

\W 任意非单词字符

//\W 匹配任意非 数字字母下划线
$reg16='/^\W$/';   //[^0-9a-zA-Z]
var_dump(preg_match($reg16,'#'));
3. 数量元字符(限定类)

对于重复出现的字母或字串,可以使用限定类字符来实现匹配,限定符主要有下面6种。
? 匹配前面一次或0次

//数量元字符
$reg17='/^\w?$/';//? 0次或一次
var_dump(preg_match($reg17,'a'));
  + 匹配前面一次或多次
//+ 匹配一次或多次
$reg18='/^\w+$/';//+  匹配一次或多次
var_dump(preg_match($reg18,'a4567890'));

*匹配前面0次或多次

//* 匹配0次或多次
$reg19='/^\w*$/';
var_dump(preg_match($reg19,'12'));

{n} 匹配前面n次

//手机号正则
$reg20='/^\d{11}$/'; //\d 匹配0-9之间的任意一位 {11} 匹配11次
var_dump(preg_match($reg20,'15031145623'));

{n,} 匹配前面至少n次

$reg20='/^\d{6,}$/';//{6,}至少6次  最多不限制
echo  preg_match($reg20,'1234567');

{n,m} 匹配前面至少n次最多m次

//{n,m}  至少n次至多m次
$reg22='/^\w{6,15}$/';//匹配至少6位至多15位
var_dump(preg_match($reg22,'123tregfdgfg'));

u 修饰符标识能够正确处理大于\uFFFF的Unicode字符。
i 不区分大小写
例子:
验证邮箱
//邮箱正则 中间必须包含@ 还必须包含 .
/*以数字字母下划线开头任意多位 中间包含@ . 结尾 数字字母下划线任意多位

验证手机号

//规范  以1  开头 第二位是 345789  后面是 9位数字
//\d   表示0-9
//以1  中间可以是2|3|5|7|8|9  后面几位只要是数字就行[0-9][2|3|5|7|8|9] 手机号一共11位
$reg='/^1[2|3|5|7|8|9][0-9]{9}$/';//手机号码的验证
if(!preg_match($reg,'15031145623')) {
    echo  "手机号码格式不正确,请重新输入";
}else{
    echo "ok";
}

密码的验证

//验证密码的长度为 6位以上 数字字下划线
$preg11='/^\w{6,15}$/';//正则表达式含义是  \w [任意的数字字母下划线] {6,15} 至少6位至多15位
echo preg_match($preg11,'123456qwertyu_o');

汉字的匹配

//中文的匹配匹配汉字的用户名
$reg23='/^[\x{4e00}-\x{9fa5}]{2,5}$/u';
var_dump(preg_match($reg23,'张三'));

身份证号

//身份证
//前六位是地区  四位的年份  两位的月份  两位日期   四位的加密X|x
$card='/^[1-9][0-9]{5}+[0-9]{11}+[0-9|x|X]/';
$card='/[1-9][0-9]{5}+[1|2][0|9][0-9][0-9][0|1][0-9][0-3][0-9][0-9]{3}+[0-9|x|X]/';
$reg='/^\d{17}+[0-9|X|x]$/';
echo preg_match($reg,'11111111111111111X');

三、PCRE正则表达式

表达式必须用分隔符闭合
PCRE提供了一组函数用来对正则表达式进行匹配和替换

1、 pre_match()函数[只匹配一次,一般用来做正则]

执行一个正则表达式匹配
语法:int preg_match ( string $pattern , string KaTeX parse error: Expected 'EOF', got '&' at position 18: …bject [, array &̲matches [, int $flags = 0 [, int $offset = 0 ]]] )
参数1 正则表达式编写的模式
参数2 需要验证的字符串
参数3 可选保存与第一个参数中的子模式的各个部分的匹配结果。

$preg='/apple/';//正则表达式 可以不写^  $
$str="this  is  an  apple";
echo  preg_match($preg,$str,$res);//参数1  正则的表达式  参数2 字符串  参数3  匹配到的结果
print_r($res);

2、 preg_match_all 搜索到指定字符串的结尾[匹配多次 采集]

语法:int preg_match_all ( string $pattern , string KaTeX parse error: Expected 'EOF', got '&' at position 18: …bject [, array &̲matches [, int $flags = PREG_PATTERN_ORDER [, int $offset = 0 ]]] )

//数据的采集
$preg='/apple/';
$str="this  is  an  apple apple  apple";
echo  preg_match_all($preg,$str,$res);//参数1  正则的表达式  参数2 字符串  参数3  匹配到的结果
print_r($res);

3、 preg_grep()函数 匹配数组中的元素,返回与正则表达式匹配的数组单元

语法:array preg_grep ( string $pattern , array $input [, int $flags = 0 ] )

 //preg_grep — 返回匹配模式的数组条目
 //数组正则表达式的匹配
$arr=['a','b','c','d','a','1','c'];
$pre='/c/';//只匹配a
print_r( preg_grep($pre,$arr));

4、 preg_replace()函数 执行正则表达式的搜索和替换

语法:mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int KaTeX parse error: Expected 'EOF', got '&' at position 19: …it = -1 [, int &̲count ]] )
参数1 匹配模式
参数2 替换参数
参数4 替换次数 -1 为替换所有

//preg_replace — 执行一个正则表达式的搜索和替换
$str="this  is a bananer";
$preg1='/bananer/';
echo  preg_replace($preg1,'orange',$str);

综合案例
html页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form  action="index4.php" method="post">
    <input type="text" name="name" placeholder="请输入用户名">
    <input  type="password" name="pwd" placeholder="请输入密码">
    <input type="email" name="email" placeholder="请输入邮箱">
    <input  type="tel" name="tel" placeholder="请输入电话">
    <input  type="text" name="card" placeholder="请输入身份证号">
    <input  type="submit" value="提交">
</form>

</body>
</html>

php页面
<?php
print_r($_POST);
//Array ( [name] => 张三 [pwd] => 123456 [email] => [tel] => 12345678908 [card] => 130428200401051767 )
$name=$_POST['name'];//接收用户名
$pwd=$_POST['pwd'];//接收密码
$email=$_POST['email'];//接收邮箱
$tel=$_POST['tel'];//接收电话
$card=$_POST['card'];//接收省份证号
//用户名汉字 2-4位
$pre_name='/[\x{4e00}-\x{9fa5}]{2,4}/u';
if(preg_match($pre_name,$name)==0){//返回0 是匹配失败
   echo "用户名输入格式不正确";
    die();
}
//密码6-15的数字字母下换线
$pre_pwd='/^\w{6,15}$/';//密码的正则
if(preg_match($pre_pwd,$pwd)==0){
    echo  "密码格式不正确";
    die();
}

//邮箱的正则
$prg_eamil='/^\w{1,}+@+\w{1,}+.+\w{1,}$/';//邮箱的正则
if(preg_match($prg_eamil,$email)==0){
    echo  "邮格式不正确";
    die();
}
//手机号正则
$prg_tel="/^1[0-9]{10}$/";//手机号正则
if(preg_match($prg_tel,$tel)==0){
    die  ("电话格式不正确");
}
//身份证号
$pre_card='/^[0-9]{17}[0-9|x|X]$/';//简单的身份证号
if(preg_match($pre_card,$card)==0){
    die('身份证号码格式不正确');
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值