Php 正则表达式来匹配CSS文件中的特定javaDoc属性,并提取有关CSS定义的数据

Php 正则表达式来匹配CSS文件中的特定javaDoc属性,并提取有关CSS定义的数据,php,css,regex,javadoc,Php,Css,Regex,Javadoc,我正在尝试存储一些关于CSS样式的元数据,我们的应用程序可以使用这些元数据构建菜单,允许用户选择这些样式(以及其他内容) 我认为JavaDoc风格的注释是最好的方法,并使用类似config或类似的属性。然后将JSON样式定义存储为该属性的值 我一直在尝试编写一些正则表达式(PHP)来执行以下操作: 查找具有@config属性的所有JavaDoc注释 将@config的值提取为JSON对象 然后匹配下面的css标记和类名(如果它们是在下面定义的) 因此,该注释和类定义可以提取为3个匹配项 /**

我正在尝试存储一些关于CSS样式的元数据,我们的应用程序可以使用这些元数据构建菜单,允许用户选择这些样式(以及其他内容)

我认为JavaDoc风格的注释是最好的方法,并使用类似
config
或类似的属性。然后将JSON样式定义存储为该属性的值

我一直在尝试编写一些正则表达式(PHP)来执行以下操作:

  • 查找具有
    @config
    属性的所有JavaDoc注释
  • @config
    的值提取为JSON对象
  • 然后匹配下面的css标记和类名(如果它们是在下面定义的)
  • 因此,该注释和类定义可以提取为3个匹配项

    /**
     * @config {name:'Orange Title', order:1}
     */
    h1.title_orange {
    
    }
    
    • 匹配1
      {name:'Orange Title',顺序:1}
    • 匹配2
      h1
    • 匹配3
      title\u orange

    更复杂的是JSON部分可能是多行的,多行可能包含也可能不包含
    *

    最大的任务在于您所做的假设(要测试哪些内容):

    你可以在这里测试它

    我假设您在javaDoc的第一个注释行中有config,我还假设在这些注释行之间可能有多个空格,您的单词/类/id可能有
    -

    你还需要什么

    编辑 这在Rubular中非常有效。尽管不同语言的正则表达式应该是相同的,但这在–4分钟前似乎不起作用

    你说得对,所以我将其压缩到一个匹配组中(你必须单击preg_match_all选项卡):

    也就是说,我将javaDoc和CSS放在一起考虑(javaDoc有几行代码)。尽管如此,仍有可能需要进行调整

    编辑2
    太棒了,非常感谢!如果@config不总是注释中的第一个条目呢?这还有可能吗?——7分钟前

    它是:

    \/[*]{2}(?:[\s\n\r]+.*)*[\s\n\r]+\*\s@config\s(.*)[\s\n\r]+.*[\s\n\r]+\*\/[\s\n\r]+[\#\.]?([\w-]+)\s*(?:[\#\.]*([\w-]+)\s*)*{
    
    你可以试试这个

    编辑3 马特将自己的正则表达式进化为。问题似乎是捕获组不能无限期地重复(以获取所有CSS类/ID):


    因此,这仍然需要解决…

    伟大的工作!很抱歉删除我的评论。我删除它是因为你原来的正则表达式在preg_split选项卡上工作。但是这个新的正则表达式更好!我认为开头的部分,
    \/\*\*
    可以替换为
    /[*]{2}
    ,使正则表达式变得更简单。这太棒了,非常感谢!如果@config不总是注释中的第一个条目呢?还有可能吗?@Armfoot非常感谢你在这方面的帮助,救生员!Iv'e试图修改你的例子,这样我们就可以在评论结构上有更多的自由,我离你很近了。。但最后一部分让我困惑。我们如何允许它支持多个逗号分隔的声明(参见示例链接)考虑到这一点,我可能只需要匹配整个CSS声明(标记/id/类部分),然后再进行处理,看看是否有,如果是类、id或标记等。这使得reg ex更简单,而且无论如何我都需要检查类型。。。。
    \/[*]{2}[\s\n\r]+\*\s@config\s(.*)[\s\n\r]+.*[\s\n\r]+\*\/[\s\n\r]+[\#\.]?([\w-]+)\s*(?:[\#\.]*([\w-]+)\s*)*{
    
    \/[*]{2}(?:[\s\n\r]+.*)*[\s\n\r]+\*\s@config\s(.*)[\s\n\r]+.*[\s\n\r]+\*\/[\s\n\r]+[\#\.]?([\w-]+)\s*(?:[\#\.]*([\w-]+)\s*)*{
    
    (?:[\#\.\,]([\w-]+)\s*)*