ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

JsonQ高级扩展指南:whereMatch正则匹配与macro自定义查询逻辑,解锁PHP JSON查询的终极能力

JsonQ高级扩展指南:whereMatch正则匹配与macro自定义查询逻辑,解锁PHP JSON查询的终极能力 JsonQ高级扩展指南whereMatch正则匹配与macro自定义查询逻辑解锁PHP JSON查询的终极能力【免费下载链接】jsonqA PHP query builder for JSON项目地址: https://gitcode.com/gh_mirrors/js/jsonqJsonQ 是一款优雅的PHP JSON查询构建器A PHP query builder for JSON让你能用类似 ORM 的链式语法轻松查询任何 JSON 数据。但当内置的where、whereContains等操作符无法满足复杂筛选时whereMatch正则匹配与macro自定义查询逻辑就是你的终极武器。本文将用通俗易懂的方式带你从零掌握这两项高级扩展让 PHP JSON 数据处理效率直接翻倍。为什么需要正则匹配与自定义宏先看一个场景你有一份用户数据想筛选出所有手机号以 88 开头的记录。用where(phone, startswith, 88)可以做到但如果要筛选88 开头且后跟 11 位数字的严格手机号格式呢内置操作符就无能为力了。这正是 JsonQ 两大高级特性的用武之地whereMatch正则匹配用正则表达式做模式匹配精准控制字符串格式macro宏注册你自己的判断函数实现任何脑洞大开的筛选逻辑两者都在where()的操作符体系内工作与 JsonQ 的链式查询无缝衔接堪称插上翅膀的 where。快速上手JsonQ 基础链式查询在进入高级特性前先回顾一下 JsonQ 的核心用法数据来自 examples/data.jsonuse Nahid\JsonQ\Jsonq; $q new Jsonq(data.json); $result $q-from(products) -where(cat, , 2) -get();这套「from()选路径 →where()加条件 →get()取结果」的链式语法是所有高级查询的地基。核心实现位于 src/Jsonq.php。第一招whereMatch 正则匹配完全教程whereMatch 的基础用法whereMatch的作用是判断字段值是否匹配某个正则表达式。它的操作符名为match正则表达式作为匹配值传入// 筛选手机号符合 88开头11位数字 格式的用户 $result $q-from(users) -where(phone, match, /^88[0-9]{11}$/) -get();也可以使用简写方法效果完全等价$result $q-from(users) -whereMatch(phone, /^88[0-9]{11}$/) -get();注意正则匹配只对字符串类型的数据有效这是它的天然边界使用时要确保字段值是字符串。三个高频正则场景示例场景一邮箱格式校验$result $q-from(users) -whereMatch(email, /^[\w.-][\w-]\.[\w.]$/) -get();场景二日期范围筛选2023年内的订单$result $q-from(orders) -whereMatch(created_at, /^2023-/) -get();场景三模糊关键词匹配产品名含mac或iPhone$result $q-from(products) -whereMatch(name, /(mac|iPhone)/i) -get();正则的匹配逻辑由 JsonQ 底层条件引擎驱动相关单元测试可参考 tests/ConditionTest.php 中的testMatch()其中展示了88[0-9]{11}这类正则的命中与不命中用例是理解匹配规则的最佳教材。第二招macro 自定义查询逻辑完全教程什么是 macro有时候正则也不够用——比如你想判断价格是否在某个区间且为偶数这种复杂逻辑用内置操作符很难表达。macro 宏就是为此设计的你可以注册一个自定义判断函数然后像内置操作符一样在where()中使用它。宏的注册与使用宏是静态注册的注册一次全局可用。参考 examples/index.php 中的经典写法use Nahid\JsonQ\Jsonq; // 第一步注册名为 less 的宏判断值是否小于给定值 Jsonq::macro(less, function ($payable, $val) { return $payable $val; }); // 第二步像内置操作符一样使用它 $result $q-from(products) -where(price, less, 50000) // 价格小于 5 万的商品 -get();宏函数的签名为function ($payable, $val)$payable数据中该字段的实际值$val你在where()中传入的第三个参数返回true表示匹配false表示排除宏的进阶玩法三个实用注册示例示例一判断整数类型Jsonq::macro(isInt, function ($payable, $val) { return is_integer($payable); }); $result $q-from(products) -where(stock, isInt) -get();示例二区间判断价格在 min 和 max 之间Jsonq::macro(between, function ($payable, $val) { return $payable $val[0] $payable $val[1]; }); $result $q-from(products) -where(price, between, [30000, 100000]) -get();示例三模糊业务判断判断用户是否为 VIPJsonq::macro(isVip, function ($payable, $val) { return $payable[level] 5 $payable[active] true; }); $result $q-from(users) -where(membership, isVip) -get();第三招组合拳——正则与宏的联合查询高级特性最大的魅力在于自由组合。你可以把whereMatch、macro 和链式方法混合使用构建复杂的业务查询// 筛选价格在区间内 名称匹配 mac 分类为 2并按价格降序 $result $q-from(products) -where(price, between, [50000, 150000]) -whereMatch(name, /mac/i) -where(cat, , 2) -sortBy(price, desc) -get();再配合orWhere实现或逻辑// 名称含 iPhone 或 价格小于 1.2 万 $result $q-from(products) -whereMatch(name, /iPhone/) -orWhere(price, less, 12000) -get();实用技巧与注意事项效率与性能建议优先使用内置操作符where、whereContains、whereStartsWith等内置条件性能更优whereMatch和 macro 只在确实需要时使用正则预编译意识在循环中对同一正则反复匹配时可先把正则编译好再传入宏的复用性把常用的宏集中注册比如写进一个独立的引导文件避免重复代码JsonQ 的辅助函数jsonq()定义在 helpers/jsonq.php可参考其组织方式常见坑位提醒⚠️whereMatch仅对字符串字段生效数值或 null 字段会直接不匹配可参考 tests/ConditionTest.php 中的matchProvider()边界用例⚠️ 正则表达式请用分隔符包裹如/pattern/i否则可能被当作普通字符串比较⚠️ macro 函数必须返回布尔值返回其他类型会导致判断失效⚠️ 宏是静态注册的注册名不要与内置操作符如match、contains冲突总结至此你已经完整掌握了 JsonQ 的两大高级扩展特性适用场景核心语法whereMatch字符串格式校验、模式匹配whereMatch(field, /regex/)macro任意自定义业务逻辑Jsonq::macro(名, fn)where(field, 名, val)当常规查询条件不够用时whereMatch正则匹配帮你解决格式问题macro自定义查询逻辑帮你解决业务问题两者结合几乎能覆盖所有复杂的 PHP JSON 数据筛选需求。把这两个能力加入你的工具箱JsonQ 就不再只是一个简单的 JSON 查询器而是一台真正可编程的JSON 数据处理引擎。快去 examples/ 目录看看更多实战示例动手把正则与宏用起来吧【免费下载链接】jsonqA PHP query builder for JSON项目地址: https://gitcode.com/gh_mirrors/js/jsonq创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表