双向模式:使用相同的模式来解析和格式化字符串

时间:2012-03-05 21:28:30

标签: php design-patterns matching

我有以下任务(PHP作为语言),它由两部分组成:

  1. 根据某种模式将输入字符串解析为命名字段;
  2. 使用带有一组命名字段的相同模式生成输出字符串。
  3. E.g。模式是/users/{id}/{action},并且:

      输入字符串/users/367/edit命名字段的
    • 将为{ id:"367", action:"edit" };
    • 表示输入地图{ id:"15", action:"delete" }输出字符串为/users/15/delete

    这里棘手的部分是我希望像正则表达式一样有一些力量和灵活性,但努力最少。即优雅的东西,理想的单线。如果可能的话,宁愿不实现自定义模式解析。

    不好的例子是:

    1. preg_match中的命名群组,例如#^/users/(?<id>\w+)/(?<action>\w+)$#
      • 好:解析时有很大的灵活性,命名匹配;
      • bad:编写字符串格式化程序非常困难。
    2. sscanf / sprintf,例如/users/%s/%s
      • 好:非常紧凑,易于阅读;
      • bad:没有命名匹配,贪婪匹配(上面的模式中的第一个%s会在/users/之后吃掉所有内容),sscanf格式如%[^/]无法直接传递给{ {1}}。
    3. 类似shell的sprintf,例如fnmatch
      • good:众所周知且易于读/写的shell模式;
      • bad:不支持所有shell fanciness(如/users/*/*),没有命名字段,也没有简单的方法从同一模式生成字符串。
    4. 所以,也许我只是遗漏了一些东西,也许有一些众所周知的(但我不知道)模式匹配的东西,如shell模式或正则表达式,可立即在PHP中使用,或者易于实现?< / p>

      谢谢。

0 个答案:

没有答案