第一章:当用户输入变成“开盲盒”——你的注册页面安全吗?
嘿,程序员朋友,你有没有经历过这种崩溃时刻?
深夜,你刚写完一个漂亮的用户注册页面,美滋滋地测试了一下——“admin”注册成功,“123456”密码通过,“not-an-email”居然被识别为邮箱!更绝的是,有位“天才用户”在用户名里输入了一串神秘代码:<script>alert('哈哈')</script>,然后你的页面就开始“跳舞”了。
别问我怎么知道的,都是泪啊!
这就是为什么我们需要正则表达式——它不是魔法,但比魔法更实用。想象一下,你是一位海关官员,用户输入的信息就像过境的旅客。没有正则的时候,你只能凭肉眼判断:“嗯,这个人长得像邮箱……大概吧?”有了正则之后,你手里就有了一份精确的护照验证机器,合不合格,一秒见分晓!
第二章:正则表达式——程序员手中的“格式照妖镜”
2.1 正则到底是什么鬼?
简单说,正则表达式就是一串描述文本规则的字符。比如:
- 想验证邮箱?规则是“必须有@,@前面有字符,后面有点,点后面还有字符”
- 想验证手机号?规则是“1开头,第二位是3-9,后面跟着9位数字”
把这些规则用特定语法写出来,就是正则表达式。在PHP里,正则就像你的超能格式检测仪,专门对付那些不按套路出牌的输入。
2.2 PHP中的两大“正则门派”
PHP有两种正则函数,别晕,我帮你理清楚:
门派一:PCRE函数(推荐!)
preg_match('/正则模式/', $要检查的字符串);
特点:功能强大,语法清晰,像个稳重的大哥。我们主要用这个。
门派二:POSIX函数(已过时)
ereg('正则模式', $要检查的字符串);
特点:PHP 5.3后就退休了,现在还在用它的话……嗯,该更新知识库啦!
第三章:手把手教你正则“黑话”(其实超简单!)
3.1 先认识几个“核心成员”
// 1. 普通字符——就找它自己
preg_match('/hello/', 'hello world'); // 找到!返回1
// 2. 元字符——有特殊技能的字符
. // 匹配任意单个字符(除了换行)
\d // 匹配数字,相当于[0-9]
\w // 匹配字母、数字、下划线
\s // 匹配空白(空格、制表符等)
^ // 匹配字符串开头
$ // 匹配字符串结尾
// 3. 量词——控制出现次数
* // 出现0次或多次
+ // 出现1次或多次
? // 出现0次或1次
{n} // 恰好出现n次
{n,} // 至少出现n次
{n,m} // 出现n到m次
// 4. 字符组——多选一
[abc] // 匹配a或b或c
[a-z] // 匹配任意小写字母
[0-9A-Z] // 匹配数字或大写字母
[^abc] // 匹配除了a、b、c之外的字符
3.2 举个栗子,一看就懂
// 情况1:用户想注册为“user123”,行不行?
$pattern = '/^[a-zA-Z][a-zA-Z0-9_]{3,15}$/';
// 翻译成人话:
// ^ 开头
// [a-zA-Z] 第一个字符必须是字母
// [a-zA-Z0-9_] 后面可以是字母、数字、下划线
// {3,15} 长度总共4-16位(第一个字符+后面3-15个)
// $ 结束
echo preg_match($pattern, 'user123'); // 1,通过!
echo preg_match($pattern, '123user'); // 0,失败,数字开头不行
echo preg_match($pattern, 'ab'); // 0,失败,太短了
第四章:实战!用正则武装你的注册页面
4.1 需求分析:到底要验证啥?
一个合格的注册页面,至少要验证:
- 用户名:3-20位,字母开头,允许字母数字下划线
- 密码:8-20位,必须包含大小写字母和数字
- 邮箱:符合标准邮箱格式
- 手机号:中国大陆11位手机号
4.2 逐个击破:编写验证正则
用户名验证:防捣蛋小能手
function validateUsername($username) {
$pattern = '/^[a-zA-Z][a-zA-Z0-9_]{2,19}$/';
// 解释:字母开头,总长3-20,允许字母数字下划线
// 为什么{2,19}?因为第一个字符已经占了一位!
if (!preg_match($pattern, $username)) {
return "用户名格式不对!要求:字母开头,3-20位,可含字母、数字、下划线";
}
return true;
}
密码验证:安全感满满
function validatePassword($password) {
// 方案1:复杂但精准的写法
$pattern = '/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d!@#$%^&*]{8,20}$/';
// 翻译一下这个“天书”:
// (?=.*[a-z]) 必须包含至少一个小写字母
// (?=.*[A-Z]) 必须包含至少一个大写字母
// (?=.*\d) 必须包含至少一个数字
// [a-zA-Z\d!@#$%^&*]

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



