
后端开发工具【免费下载链接】ValidationThe most awesome validation engine ever created for PHP项目地址https://gitcode.com/gh_mirrors/va/Validation点击查看免费下载导读StartsWith是 PHP 校验库 Respect Validation 中用于判定输入是否以指定值开头的校验器同时支持字符串与数组两类输入对字符串检查其开头是否为给定子串对数组检查其首元素是否等于给定值。本文从官方文档出发结合 StartsWith.php 源码与单元/功能测试完整讲解其调用签名、严格比较语义、多值匹配v3.1 新增、消息模板与占位符、以及从 v2 迁移时的行为变化读完即可在真实项目中正确使用v::startsWith()。一、校验器签名与适用场景官方文档给出的两种构造签名如下StartsWith(mixed $startValue) StartsWith(mixed $startValue, mixed ...$startValues)第一个参数$startValue是必填的起始值从第二个参数开始的可变参数...$startValues用于追加额外的起始值v3.1.0 起支持只要输入以其中任意一个值开头校验即通过。在分类上该校验器同时被归入Arrays数组与Strings字符串两类见 StartsWith.md因此它并非字符串专用校验器——数组场景下它校验的是首元素这一点将在后文重点展开。典型的落地场景包括校验 URL 协议前缀v::startsWith(http)、校验称呼前缀Dr./Mr.、校验版本号前缀、校验令牌化数组的第一个元素等。官方 Url.md 中就给出了与url()组合的示例v::startsWith(http)-url()-assert(http://example.com); // 通过 v::startsWith(http)-url()-assert(ftp://example.com); // 失败二、字符串前缀匹配严格且大小写敏感对字符串输入文档给出的通过示例为v::startsWith(lorem)-assert(lorem ipsum); // Validation passes successfully v::startsWith(Dr., Mr.)-assert(Dr. Jane Doe); // Validation passes successfully从源码StartsWith.php 的validateIdentical()方法可以看到其底层实现if (is_string($input) is_string($startValue) mb_strpos($input, $startValue) 0) { return true; }几个关键实现事实使用多字节安全的mb_strpos()判断起始位置返回值严格等于0才视为命中 0因此只检查开头与Contains的任意位置语义不同要求$input与$startValue同时是字符串类型不匹配时该分支直接跳过不会产生 PHP 错误比较是大小写敏感的单元测试 tests/unit/Validators/StartsWithTest.php 明确将new StartsWith(foo)对输入FOObarbaz判定为无效输入非字符串、非数组的输入如整数123、浮点数、布尔值一律判定为不通过。此外命中判定只依赖开头foobazfoo可以通过startsWith(foo)但faabarbaz、baabazfaa、baafoofaa均不通过——foo出现在中间或末尾都不算数均有对应测试用例佐证。三、数组前缀匹配仅检查首元素文档给出了三个数组示例其中最后一个最值得注意v::startsWith(lorem)-assert([lorem, ipsum]); // Validation passes successfully v::startsWith(0, 1)-assert([0, 1, 2, 3]); // Validation passes successfully v::startsWith(0, 1)-assert([1, 2, 3]); // Validation passes successfully源码中对应的数组分支是if (is_array($input) reset($input) $startValue) { return true; }三个实现要点只看首元素reset($input)取出数组第一个元素其余元素不参与判断。所以[1, 2, 3]与[1, 1, 3]虽都含1但只有首元素恰好匹配才通过。严格相等比较同时约束类型与值。单元测试中的两对用例直观印证了这一点new StartsWith(1)对[1, 2, 3]→通过字符串1与1严格相等new StartsWith(1)对[1, 1, 3]与[1, 2, 3]→不通过首元素是整数1与字符串1不严格相等。无类型混合的宽容[1.1, 2.2]可以配合startsWith(1.1)使用浮点首元素对浮点起始值见功能测试 tests/feature/Validators/StartsWithTest.php 的 Scenario #2。第三个示例v::startsWith(0, 1)-assert([1, 2, 3])之所以通过是因为起始值集合为{0, 1}数组首元素1命中其一——这正是多值匹配的典型用法。四、多值匹配v3.1 起支持的...$startValues从 v3.1.0 开始StartsWith支持同时传入多个起始值输入只需命中其中任意一个。构造器源码public function __construct( mixed $startValue, mixed ...$startValues, ) { $this-startValues [$startValue, ...$startValues]; }evaluate()内部则根据起始值数量自动选择消息模板$template self::TEMPLATE_STANDARD; if (count($this-startValues) 1) { $template self::TEMPLATE_MULTIPLE_VALUES; }仅传入 1 个起始值时使用TEMPLATE_STANDARD消息中只体现{{startValue}}传入 2 个及以上起始值时自动切换为TEMPLATE_MULTIPLE_VALUES常量值为__multiple_values__消息中的起始值列表通过{{startValues|list:or}}渲染为 A or B 的英文列表。validateIdentical()对多值的处理是一个简单的循环依次拿每个起始值分别对字符串分支与数组分支做上述判定任一命中即返回true。这也解释了文档与测试中的经典用法v::startsWith(Dr., Mr.)-assert(Dr. Jane Doe)通过而v::startsWith(Mr., Dr.)-assert(John Doe)失败失败消息为John Doe must start with Mr. or Dr.五、消息模板与占位符1.StartsWith::TEMPLATE_STANDARD单值模式模板default{{subject}} must start with {{startValue}}inverted{{subject}} must not start with {{startValue}}2.StartsWith::TEMPLATE_MULTIPLE_VALUES多值模式模板default{{subject}} must start with {{startValues\|list:or}}inverted{{subject}} must not start with {{startValues\|list:or}}3. 占位符说明占位符说明subject被校验的输入或指定的自定义校验器名称如使用v::named()startValue被检查是否位于输入开头的那个值单值场景startValues附加的待检查起始值多值场景这些模板并非手写在文档里而是直接通过 PHP 8 的#[Template]属性声明在 StartsWith.php 的类定义之上并随校验结果返回。需要说明的是default与inverted两种模式分别对应正常校验与取反校验如v::not(v::startsWith(...))功能测试 Scenario #2 / #4 / #6 展示了inverted消息的实际输出管道语法{{startValues|list:or}}属于占位符修饰器Placeholder Pipes体系详见 placeholder-pipes.md|后跟修饰器名即可定制渲染方式list:or会把数组渲染为以 or 连接的列表。4. 消息的真实输出形态结合功能测试 tests/feature/Validators/StartsWithTest.php实际输出的消息形如[a, b] must start with b // 数组输入字符串起始值带引号 [1.1, 2.2] must not start with 1.1 // 取反模式浮点起始值不带引号 - [3.3, 4.4] must start with 3.3 // 完整消息带列表前缀 Dr. John Doe must not start with Mr. or Dr. // 多值 取反可见subject会根据输入类型被渲染为带反引号的 JSON 数组或带引号的字符串占位符值也会按类型智能加引号便于直接定位是哪一段输入、哪个起始值不匹配。六、边界行为与严格语义小结综合文档、源码与测试StartsWith的判定规则可以收敛为一张行为表输入类型判定逻辑边界说明字符串mb_strpos($input, $startValue) 0要求起始值也是字符串大小写敏感空字符串永远不通过数组reset($input) $startValue仅检查首元素严格比较类型与值其他类型int/float/bool/null直接不通过源码两个分支都进不去不会抛 PHP 错误值得特别提醒的两个反直觉点空字符串不能作为匹配目标new StartsWith(foo)校验被判为无效见单元测试 providerForInvalidInput 中的[]用例因为空字符串开头不存在任何内容严格类型在数组场景尤其容易踩坑想匹配[1, 2, 3]中的整数首元素必须传整数起始值startsWith(1)传字符串startsWith(1)会因1 ! 1而失败。七、与其他校验器的关系与选用建议官方文档将StartsWith与以下校验器并列推荐StartsWith.md 的 See Also 章节链接均指向 docs/validators 目录Contains检查值是否出现在输入的任意位置是StartsWith最相近的宽松版EndsWith语义完全对称检查值是否位于结尾对字符串使用mb_strrpos判定对数组使用end($input)检查末元素见 EndsWith.phpIn检查输入是否完全等于候选集合中的某个值适合精确枚举Regex需要正则式前缀如^https或更复杂头部模式时的通用方案Trimmed若需容忍首尾空白可与Trimmed组合使用。选型建议一句话必须位于开头 用StartsWith出现在任何位置 用Contains位于结尾 用EndsWith整体等于候选之一 用In模式复杂用Regex。另外StartsWith也可以作为组合校验的构件使用在 After.md、Each.md、All.md 中它分别出现在v::key(scheme, v::startsWith(http))、v::each(v::startsWith(2010))等链条里用于对键、集合元素批量做前缀校验。八、从 v2 迁移到 v3大小写与类型语义的收紧StartsWith的变更历史文档 Changelog版本变更3.1.0新增多值支持...$startValues3.0.0移除大小写不敏感比较0.3.9首次创建其中3.0.0 的变更影响最大v2 时代StartsWith有一个identical布尔参数用于控制大小写与严格类型v3 将其彻底移除改为永远大小写敏感 永远严格类型。迁移指南 migrating-from-v2-to-v3.md 给出了对应改写方式- v::startsWith(needle, identical: true); v::startsWith(needle); // always strict case and type这意味着升级到 v3 后startsWith(foo)将不再匹配Foo...也不再把整型1与字符串1视为等价若业务上需要宽容匹配请改用Regex如/^foo/i或先对输入做归一化如v::lowercase()-startsWith(foo)。九、测试验证源码级证据链StartsWith的行为由两层测试覆盖单元测试tests/unit/Validators/StartsWithTest.php继承RuleTestCase通过providerForValidInput/providerForInvalidInput数据提供器穷举字符串、数组、多值、类型混用等 18 组场景是上文所有边界结论的直接依据功能测试tests/feature/Validators/StartsWithTest.php以catchMessage/catchFullMessage断言失败消息的逐字输出验证了default/inverted两种模式及list:or多值渲染的真实文本。运行方式依据项目根目录的 phpunit.xml.dist 与 Pest.phpvendor/bin/pest tests/feature/Validators/StartsWithTest.php vendor/bin/phpunit tests/unit/Validators/StartsWithTest.php十、实战速查一份可复制的使用清单use Respect\Validation\Validator as v; // 1. 字符串前缀大小写敏感、严格类型 v::startsWith(lorem)-assert(lorem ipsum); // 通过 v::startsWith(lorem)-assert(Lorem ipsum); // 失败大小写 v::startsWith(lorem)-assert(x lorem ipsum); // 失败不在开头 // 2. 数组首元素 严格比较 v::startsWith(0)-assert([0, 1, 2]); // 通过 v::startsWith(0)-assert([1, 0, 2]); // 失败只看首元素 // 3. 多起始值任一命中即通过v3.1 v::startsWith(Dr., Mr., Ms.)-assert(Dr. Jane Doe); // 通过 // 4. 取反与自定义名称 v::not(v::startsWith(http))-assert(ftp://example.com); // 通过 v::named(Scheme, v::startsWith(http))-assert(ftp://x); // 消息中 subject 为 Scheme // 5. 组合仅对指定键/元素校验 v::key(scheme, v::startsWith(http))-assert([scheme http://a.com]); // 通过 v::each(v::startsWith(2010))-assert([2010-01, 2010-12]); // 通过结语StartsWith是 Respect Validation 中语义最清晰的头部匹配校验器字符串场景依赖mb_strpos定位起始位置数组场景依赖reset 严格相等只看首元素v3.1 的多值支持与自动切换的消息模板让它在枚举场景下同样顺手。理解其大小写敏感、严格类型、仅头部、仅首元素四条铁律就能在字符串前缀、数组首元素、协议头校验等场景中准确选用并在从 v2 升级到 v3 时避开行为收紧带来的回归问题。更多关联校验器可继续查阅 Contains.md、EndsWith.md、In.md、Regex.md 与 Trimmed.md。赞分享后端开发工具【免费下载链接】ValidationThe most awesome validation engine ever created for PHP项目地址https://gitcode.com/gh_mirrors/va/Validation点击查看免费下载相关推荐Respect Validation 的 Consonant 验证器辅音字符串校验的完整实战指南Respect Validation 的 Consonant 验证器辅音字符串校验的完整实战指南 导读 Consonant 是 Respect Validat后端开发工具Respect Validation 的 Lowercase 校验器字符串全小写校验的原理与实战Respect Validation 的 Lowercase 校验器字符串全小写校验的原理与实战 导读 本文深入讲解 PHP 校验库 Respect Vali后端开发工具Respect Validation 的 Json 验证器使用 PHP json_validate 校验 JSON 字符串的完整指南Respect Validation 的 Json 验证器使用 PHP json_validate 校验 JSON 字符串的完整指南 本篇技术指南以 Resp后端开发工具上一篇如何轻松下载B站视频哔哩下载姬DownKyi完整使用指南下一篇AO3镜像站完全指南三步解锁全球最大同人创作天堂 创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考