You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel自定义验证规则:禁止字符串仅含标点或包含Emoji

字符串校验实现方案(拦截纯标点/含Emoji非法输入)

核心校验规则

满足任意一条即判定为输入不通过:

  • 字符串完全由标点符号构成,无字母、数字等有效内容
  • 字符串中包含任意Emoji表情字符
    校验效果对齐示例要求:
".."        => fail
"-----"     => fail
",,,,"      => fail
"Mc-Donald" => pass

正则实现逻辑

采用PHP原生Unicode字符属性匹配,比硬编码Emoji范围的兼容性、覆盖度更高,注意所有正则必须携带/u修饰符开启UTF-8模式,避免中文、特殊字符匹配乱码:

  1. 纯标点检测正则:/^[\p{P}\p{S}]+$/u
    • \p{P}匹配所有Unicode标准标点字符,覆盖中英文常见标点、连字符、点号、逗号等
    • \p{S}匹配符号类字符,避免纯特殊符号组合绕过校验
    • 整段正则匹配从字符串开头到结尾全为标点/符号的场景,命中即为纯标点非法输入
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 14:42:22