0

我正在寻找一种模式匹配数组的“几何”的方式,即元素出现的顺序,而不是直接匹配每个元素的内容。

让我通过一些例子来概述我的意思。给定目标数组:

array('T_STRING','T_VARIABLE','ASSIGN','T_STRING','LPAREN','T_VARIABLE','COMMA','T_VARIABLE','RPAREN');
//as a matter of fact, these would be the tokens for the PHP code "foo $var = Foo($arg1,$arg2)'

然后以下“模式”将匹配,返回匹配的从 0 开始的索引,以及分组的索引,就像 preg_match_all() 对字符串所做的那样:

array('T_STRING', '?', '(', 'T_VARIABLE', 'ASSIGN' ')', '?',
    'T_STRING', 'LPAREN', '(', 'T_VARIABLE', 'COMMA', '?', ')', '?', 'RPAREN');

这只是一个简化的 PoC,我打算使用它的方式要复杂得多,而且我不想使用 PEAR 的完整解析器生成器(到 PHP 的柠檬端口),这将是矫枉过正。

您是否知道一个函数(可能不是内部 PHP 函数)或项目可以做到这一点?

谢谢你。

4

2 回答 2

1

每当我听到“模式匹配”时,我都会想到“正则表达式”。

将该数组推送到一个字符串,并使用正则表达式匹配您正在寻找的模式。您可以进行符号替换以使正则表达式小而易于管理:

您上面的数组可以简化为这样的字符串:

$arrayPattern = 'SVASL_PVCVR_P'

现在您可以使用 RegEx 来匹配它。

if (preg_match('/VA/', $arrayPattern)) 
  print "You've got a Variable followed by an Assign!";

只是一个想法....

于 2009-11-25T19:53:52.453 回答
1

如果您正在寻找代码分析,那么Sebastian Bergmann 的这些幻灯片可能对您有用。从幻灯片 17 开始是按令牌分析的示例。

于 2009-11-25T20:07:17.773 回答