Laravel自定义验证规则:禁止字符串仅含标点或包含Emoji
字符串校验实现方案(拦截纯标点/含Emoji非法输入)
核心校验规则
满足任意一条即判定为输入不通过:
- 字符串完全由标点符号构成,无字母、数字等有效内容
- 字符串中包含任意Emoji表情字符
校验效果对齐示例要求:
".." => fail "-----" => fail ",,,," => fail "Mc-Donald" => pass
正则实现逻辑
采用PHP原生Unicode字符属性匹配,比硬编码Emoji范围的兼容性、覆盖度更高,注意所有正则必须携带/u修饰符开启UTF-8模式,避免中文、特殊字符匹配乱码:
- 纯标点检测正则:
/^[\p{P}\p{S}]+$/u\p{P}匹配所有Unicode标准标点字符,覆盖中英文常见标点、连字符、点号、逗号等\p{S}匹配符号类字符,避免纯特殊符号组合绕过校验- 整段正则匹配从字符串开头到结尾全为标点/符号的场景,命中即为纯标点非法输入
- Emoji检测正则:
/[\p{Emoji}]/u- 依赖PHP 7.2+版本内置的Unicode字符属性支持,可覆盖所有标准Emoji表情,只要字符串中存在任意Emoji就会命中
如果偏好白名单校验逻辑,可新增白名单正则/^[\p{L}\p{N}\p{P} ]+$/u,仅允许输入各语言字母、数字、标点、空格,从根源上排除Emoji、特殊控制字符等非法内容,再叠加纯标点检测即可。
Laravel自定义验证规则代码
<?php namespace App\Rules; use Illuminate\Contracts\Validation\Rule; class ValidInput implements Rule { public function passes($attribute, $value) { // 拦截含Emoji的输入 if (preg_match('/[\p{Emoji}]/u', $value)) { return false; } // 拦截纯标点/纯符号输入 if (preg_match('/^[\p{P}\p{S}]+$/u', $value)) { return false; } // 如需开启严格白名单(仅允许字母、数字、标点、空格),放开下方注释即可 // if (!preg_match('/^[\p{L}\p{N}\p{P} ]+$/u', $value)) { // return false; // } return true; } public function message() { return '输入内容不能为纯标点,且不能包含表情符号'; } }
调用时直接在Laravel验证规则里使用new ValidInput()即可。
注意:如果运行环境PHP版本低于7.2无法使用
\p{Emoji}属性,建议优先升级PHP版本保证Emoji识别覆盖度,不建议手动维护Emoji范围列表,后续Emoji标准更新会出现漏判问题。
内容的提问来源于stack exchange,提问作者user1469914
相关产品推荐
相关产品推荐

