发布于2021-11-02 21:00 阅读(130) 评论(0) 点赞(19) 收藏(2)
作为我正在编写的系统的一部分,用户可以创建他们自己的自定义规则,在某些事件发生时运行。
他们可以使用一定数量的对象来创建这些规则,所有这些对象都具有一定数量的属性和方法:
因此,作为规则的示例,我们可以说:
“如果这个单元的奖项是‘杰出’,那么设置这个单元的所有标准来授予‘达到’”
IF UNIT.award equals “Distinction”
THEN UNIT.criteria.set_award(‘A’)
“否则,如果该单元奖励是'优异',则将该单元的任何标准的奖励设置为'实现'”
IF UNIT.award equals “Merit”
THEN UNIT.criteria.filter(‘starts’, ‘name’, ‘P’, ‘M’).set_award(‘A’)
“否则,如果该单元奖励为'通过,则将该单元名称以'P'开头的任何标准的奖励设置为'达到'”
IF UNIT.award equals “Merit”
THEN UNIT.criteria.filter(‘starts’, ‘name’, ‘P’).set_award(‘A’)
我遇到的问题是,我只是不确定如何获取对象、属性和方法的字符串,例如“UNIT.criteria.filter('starts', 'name', 'P').set_award('A' )”并将其转换为可用的东西。
我想将字符串转换为的最终结果是:
因此,我可以将其转换为实际的正确对象并返回相关值或运行相关方法。
由于我只需要支持一定数量的东西(至少现在是这样)并且我不需要任何复杂的东西,比如计算支持或变量,创建一个 Lexer 系统似乎有点过分,所以我想只使用一个正则表达式来拆分所有部分。
因此,使用上面的示例,我可以对“.”进行简单的拆分。字符,但如果该字符用于方法参数中,例如“CRITERION.filter('is', 'name', 'P.1')”,那么它就完全搞砸了。
我可以使用一个不太常见的字符来拆分它们,例如双冒号或类似“::”的东西,但如果有人出于某种原因将其放入参数中,它仍然会导致相同的问题。我尝试创建一个在字符上拆分的正则表达式,仅当它不在引号之间时,但我无法让它工作。
所以基本上我的问题是:正则表达式是最好的方法吗?(如果是这样,如果它在方法中,任何人都可以帮助我让它忽略指定的字符)。或者有没有另一种方法可以让我更容易/更好地做到这一点?
谢谢。
我认为像 eloquent 这样的 ORM 语言可以为您做到这一点。
但如果我必须这样做,那么首先我会拆分 IF THEN ELSE 部分。离开:
我猜“等于”也可以是“不等于”或“更大”,所以......我会围绕它拆分第一位。
/(?'ident'[a-z.]*?) (?'expression'equals|greater) (?'compare'[0-9a-z\“\”]+)/gi
但是围绕“equals”的爆炸也会做同样的事情。
然后我会在点周围爆炸第二部分。给予:
弹出前 2 个以获取对象和属性,然后是可能的过滤器和操作的列表。
但坦率地说,我会开发一种不会将属性与操作和过滤器混合在一起的语言。
就像是:
IF object.prop EQUALS const|var
THEN UPDATE object.prop
WITH const|var [WHERE object.prop filter const|var [AND|OR const|var]]
Eloquent 直接在 php 中做到了:
DB::table('users')
->where('id', 1)
->update(['votes' => 1]);
所以也许我会做这样的事情:
THEN object.prop->filter(a,b,c,d)->set('award','A')
这使得在 -> 周围拆分操作和在 周围的属性变得容易。
无论如何......我在https://regex101.com/上做我的正则表达式 希望这会有所帮助。
作者:黑洞官方问答小能手
链接:http://www.phpheidong.com/blog/article/190959/8b4e81bb5ff7d408a96a/
来源:php黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 php黑洞网 All Rights Reserved 版权所有,并保留所有权利。 京ICP备18063182号-4
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!