用PHP解析自定义搜索语法



有一个网站有一种自定义的查询语言,可以像这样传递:

o:target o:creature (r:mythic or r:rare) t:"artifact creature"

现在,我知道我可以使用一个相当复杂的正则表达式来解析类似的代码文件。。。但可能有多达50种不同的查询方式,当人们使用嵌套括号来搜索事物时,情况会变得糟糕得离谱。

那么:有没有一个PHP库可以自动解析这样的字符串?或者,有没有解析像这样潜在复杂事物的最佳实践?(我正在寻找YAML,它看起来很复杂,但这可能是答案。)

这比你想象的要复杂一些,特别是如果你要使用这样的括号内的子表达式,但你可能需要将其分解为逻辑项,并使用修改后的Shutting Yard算法将其推送到类似堆栈的RPN/postfix记法算法中。

根据您在语句中显式的or判断,我假设在搜索查询中其他所有内容都应该是and。为此,我们将and表示为+or表示为*,您的表达式将等效于:

o:target + o:creature + ( r:mythic * r:rare ) + t:"artifact creature" 

RPN/postfix 中应该有这样的内容

o:target o:creature + r:mythic r:rare * + t:"artifact creature" +

您可能希望使用strtok(使用特殊情况来处理没有前导/尾随空格的括号以及匹配的引号)遍历字符串,以构建一个逻辑结构,然后可以使用该逻辑结构以您喜欢的任何语言构建查询表达式。

这样做可能有点复杂,但最终理论上可以无限嵌套语句,也可以合并其他运算符或函数。

最新更新