您好,登录后才能下订单哦!
# PHP怎么利用正则过滤字符
正则表达式(Regular Expression)是处理字符串的强大工具,PHP通过内置的PCRE(Perl Compatible Regular Expressions)库提供了完整的正则支持。本文将详细介绍PHP中利用正则表达式进行字符过滤的7种核心方法,包含基础语法、实用函数和典型应用场景。
## 一、正则表达式基础语法
### 1. 定界符与元字符
PHP正则通常以`/`作为定界符:
```php
$pattern = '/\d+/'; // 匹配1个或多个数字
常用元字符:
- .
匹配任意单个字符(换行符除外)
- \d
数字字符 [0-9]
- \w
单词字符 [a-zA-Z0-9_]
- \s
空白字符(空格、制表符等)
*
0次或多次+
1次或多次?
0次或1次{n}
精确n次{n,}
至少n次{n,m}
n到m次// 匹配手机号
$pattern = '/^1[3-9]\d{9}$/';
// 分组捕获
$pattern = '/(\d{4})-(\d{2})-(\d{2})/';
$email = "test@example.com";
if (preg_match('/^[\w\.-]+@[\w\.-]+\.\w+$/', $email)) {
echo "有效邮箱";
}
$text = "价格:¥199,特价¥89";
preg_match_all('/¥(\d+)/', $text, $matches);
print_r($matches[1]); // 输出 [199, 89]
// 过滤HTML标签
$clean = preg_replace('/<[^>]+>/', '', $html);
// 敏感词替换
$words = ['敏感词1', '敏感词2'];
$pattern = '/'.implode('|', $words).'/i';
$text = preg_replace($pattern, '***', $text);
与preg_replace()类似,但只返回发生替换的结果
$keywords = preg_split('/\s*,\s*/', "php, mysql, apache");
// 移除非字母数字字符
$safe = preg_replace('/[^\w]/', '', $input);
// 更精确的数值过滤
if (!preg_match('/^-?\d+$/', $id)) {
die("非法ID参数");
}
// 移除所有JavaScript事件
$clean = preg_replace(
'/on\w+=[\'"].*?[\'"]/i',
'',
$html
);
$filename = preg_replace(
'/[^\w\.-]/',
'',
basename($_FILES['file']['name'])
);
$pattern = '@\bhttps?://[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/))@';
?
启用非贪婪模式preg_match('/<div>(.*?)<\/div>/', $html, $match);
(?>...)
提升匹配效率$pattern = '/\b(?>integer|int|float)\b/';
// UTF-8编码下的中文匹配
preg_match('/[\x{4e00}-\x{9fa5}]+/u', $text);
// 使用s修饰符使.匹配换行符
preg_match('/<div>(.*)<\/div>/s', $html);
// 使用m修饰符处理多行
preg_match_all('/^#\s(.+)$/m', $markdown, $titles);
// 匹配嵌套的括号
$pattern = '/\(([^()]|(?R))*\)/';
preg_match_all('/[?&]([^=]+)=([^&]+)/', $url, $matches);
$params = array_combine($matches[1], $matches[2]);
// 要求8-20位,含大小写和数字
$valid = preg_match('/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[\w]{8,20}$/', $pwd);
preg_match_all('/\[(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})\]/', $log, $timestamps);
正则测试工具:
调试方法:
// 检查正则错误
if (preg_last_error() !== PREG_NO_ERROR) {
echo "正则错误: ". preg_last_error_msg();
}
$start = microtime(true);
preg_match($pattern, $text);
echo "耗时: ". (microtime(true)-$start) . "秒";
正则表达式在PHP中实现字符过滤时,需要注意: 1. 始终对用户输入进行过滤 2. 复杂正则要添加注释说明 3. 考虑使用FILTER_VAR等替代方案处理简单场景 4. 重要过滤应当多重验证
通过合理运用正则表达式,可以构建高效安全的字符串过滤系统,有效防御各类注入攻击和数据污染问题。
附录:常用正则速查表 - 邮箱:
/^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$/
- URL:/^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/
- IPv4:/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/
“`
本文共计约1900字,涵盖从基础语法到高级应用的完整知识体系,实际使用时可根据具体需求调整正则模式。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。