使用 Respect/Validation 的 In 验证器:判断输入是否存在于指定集合(数组 / 字符串)

发布时间:2026/10/6 1:56:21
使用 Respect/Validation 的 In 验证器:判断输入是否存在于指定集合(数组 / 字符串) 后端开发工具【免费下载链接】ValidationThe most awesome validation engine ever created for PHP项目地址https://gitcode.com/gh_mirrors/va/Validation点击查看免费下载导读In是 Respect/Validation 中用于判断「输入是否包含在指定 haystack集合内」的核心验证器。它同时支持两种数据形态当 haystack 为数组时做严格类型的成员包含判断当 haystack 为字符串时做多字节安全的子串包含判断。读完本文你将掌握In的完整签名、两种包含语义、边界行为、消息模板定制方法以及它与其他验证器Contains、EndsWith、StartsWith等的适用场景区分。一、签名与基本语义依据官方文档 docs/validators/In.mdIn验证器只有一个构造参数In(mixed $haystack)haystack即「宿主容器」可以是一个数组也可以是一个字符串。验证规则为输入是否被包含在 haystack 中。它被归类为三类适用场景见 docs/validators/In.md 的 Categorization 小节Arrays判断元素是否属于某个白名单集合Comparisons作为比较类验证器的一员Strings判断字符串是否出现在某个更大的字符串中。二、两种包含模式字符串子串与数组严格成员1. 字符串模式子串包含当haystack为字符串时验证输入是否为该字符串的子串v::in(lorem ipsum)-assert(ipsum); // Validation passes successfully底层实现位于 src/Validators/In.php字符串分支调用的是多字节安全的mb_strposreturn mb_strpos($this-haystack, (string) $input) ! false;这意味着它天然支持 UTF-8 等多字节字符集不必担心中文字符串被按字节截断误判。同时注意这里的比较是大小写敏感的——v::in(Lorem Ipsum)-assert(ipsum)不会通过因为mb_strpos不做小写归一化。2. 数组模式严格成员包含当haystack为数组时验证输入是否为数组中的一员v::in([lorem, ipsum])-assert(lorem); // Validation passes successfully底层实现为return in_array($input, $this-haystack, strict: true);注意strict: true这个关键参数它启用严格比较。在单元测试 tests/unit/Validators/InTest.php 中有一条非常典型的用例可以印证这一点[new In([1, 2, 3]), 1], // 无效字符串 1 ≠ 整数 1 [new In([1, 2, 3]), 1], // 有效与字符串 1 严格匹配也就是说数字与数字字符串在数组模式下不会互相放行这可以有效避免表单提交场景中0与0混淆导致的判断失误。3. 边界行为null 与空字符串从 src/Validators/In.php 可以看到当输入为null或时走的是另一条分支if ($input null || $input ) { return $input $this-haystack; }即null只能匹配null空字符串只能匹配空字符串本身。测试用例 tests/unit/Validators/InTest.php 验证了new In()对有效、new In([null])对null有效而new In(barfoobaz)对和null都是无效的tests/unit/Validators/InTest.php。这避免了空输入被误认为总能匹配任意子串的逻辑漏洞。三、作为可组合验证器使用In在源码层面被标注为可组合验证器Composable#[Composable(with: [Length::class, Max::class, Min::class])]见 src/Validators/In.php。这意味着在链式调用中In之后可以自然衔接Length、Max、Min等验证器例如v::in([10, 20, 30])-length(1, 2)-assert(20);组合能力由 src/ValidatorBuilder.php 中的ComposableMap解析机制提供支持这让你可以在一个验证链中既限定取值集合又对匹配结果做进一步约束。四、作为 PHP 属性Attribute使用In声明了完整的属性元数据src/Validators/In.php#[Attribute(Attribute::TARGET_PROPERTY | Attribute::IS_REPEATABLE)]因此它可以像其他验证器一样以原生 PHP 8 属性的形式直接作用于类的属性上用于数据对象DTO的声明式校验final class Order { #[In([pending, paid, shipped])] public string $status; }五、消息模板与占位符与其他验证器一致In的错误消息模板中包含了{{haystack}}占位符方便在错误信息中回显期望的集合内容。标准模板In::TEMPLATE_STANDARD文档 docs/validators/In.md 给出了默认与反向两种模式模式模板default{{subject}} must be in {{haystack}}inverted{{subject}} must not be in {{haystack}}其中inverted模式用于v::not(v::in(...))这种否定链。功能测试 tests/feature/Validators/InTest.php 给出了实际渲染效果// Scenario #1集合匹配失败 v::in([3, 2])-assert(1); // → 1 must be in [3, 2] // Scenario #2否定模式inverted 模板 v::not(v::in(foobar))-assert(foo); // → foo must not be in foobar // Scenario #3完整消息数组模式 v::in([2, 1, 3])-assert(2); // → - 2 must be in [2, 1, 3]可以看到haystack在消息中会以反引号包裹的数组字面量形式呈现便于开发者一眼看出期望值集合。占位符说明占位符说明haystack构造时传入的宿主集合数组或字符串subject被验证的输入值或若指定了自定义验证器名称该自定义名称subject的取值规则在 docs/validators/In.md 的 Template placeholders 小节中说明它允许你在链式调用中通过命名覆盖默认的输入值显示。六、与其他包含类验证器的区别In常与另外几个包含语义的验证器混淆文档 docs/validators/In.md 的 See Also 小节列出了相关的同类验证器验证器语义适用场景Containshaystack 是否包含 needle单向包含检查与In互为反向视角ContainsAny是否包含多个候选中的任意一个多候选集合命中StartsWith是否以指定前缀开始前缀匹配EndsWith是否以指定后缀结束后缀匹配Roman是否为罗马数字数字格式校验一个简单的选择原则需要判断输入在不在一个集合里用In需要判断宿主里有没有某个输入用Contains。两者的实现都基于mb_strpos见 src/Validators/Contains.php但传入参数的方向恰好相反。七、变更历史与兼容性提示依据 docs/validators/In.md 的 Changelog 小节版本变更说明3.0.0移除了大小写不敏感比较0.3.9验证器创建这一变更影响很大如果你从 v2 迁移到 v3可参考 docs/migrating-from-v2-to-v3.md原来v::in(FOO)-assert(foo)这种大小写不敏感的用法将不再通过。需要大小写不敏感匹配时请改用Contains类验证器或先对被校验字符串做归一化处理如mb_strtolower再进入In校验。小结In是一个实现精巧、语义清晰的包含验证器数组场景下以strict: true保证类型安全字符串场景下以mb_strpos保证多字节安全同时对null/空字符串做了显式的边界处理。配合TEMPLATE_STANDARD的默认/反向模板、可组合属性with: [Length, Max, Min]以及 PHP 8 属性声明它既能独立完成白名单与子串校验也能无缝嵌入复杂的验证链与 DTO 声明式校验中。赞分享后端开发工具【免费下载链接】ValidationThe most awesome validation engine ever created for PHP项目地址https://gitcode.com/gh_mirrors/va/Validation点击查看免费下载相关推荐Hugo 模板函数 collections.Inin判断切片、数组与字符串中是否包含指定值Hugo 模板函数 collections.Inin判断切片、数组与字符串中是否包含指定值 collections.In 是 Hugo 模板引擎提供的集合开发工具前端CLI30-seconds-of-code一行代码判断 JavaScript 集合数组、对象、字符串是否为空30 seconds of code一行代码判断 JavaScript 集合数组、对象、字符串是否为空 本文讲解 30 seconds of code h教程文档深蓝词库转换IME WL ConverterOpenSpec 变更归档技能实战指南openspec-archive-change 完整解析深蓝词库转换IME WL ConverterOpenSpec 变更归档技能实战指南openspec archive change 完整解析 导读 本文讲解后端开发工具上一篇突破容器性能瓶颈Docker CPU亲和性与内存限制全攻略下一篇如何深入Bedrock AgentCore的WebSocket交互式终端Python SDK实现K8s Channel协议的完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考