我正在尝试存储一些有关 CSS 样式的元数据,我们的应用程序可以使用这些元数据来构建允许用户选择这些样式(以及其他内容)的菜单。
我认为 JavaDoc 风格注释是最好的方法,并使用像 config
或类似的属性。然后将 JSON 样式定义存储为该属性的值。
我一直在尝试编写一些正则表达式(PHP)来执行以下操作:
- 查找所有带有
@config
属性的 JavaDoc 注释。 - 提取
@config
的值作为 JSON 对象 - 然后匹配以下 css TAG 和 CLASS 名称(如果它们在其下定义)。
因此这个注释和类定义可以提取到 3 个匹配项中。
/**
* @config {name:'Orange Title', order:1}
*/
h1.title_orange {
}
- 匹配 1:
{name:'Orange Title', order:1}
- 比赛 2:
h1
- 匹配 3:
title_orange
让它变得更复杂的是 JSON 部分可能是多行,并且多行可能包含也可能不包含 *
。
最佳答案
最大的任务是你所做的假设(要测试哪些内容):
(?:^\/\*\*[\s\n\r]+\*\s@config\s(.*)$|^\s+\*\/[\s\n\r]+[\#\.]?([\w-]+)\s*(?:[\#\.]*([\w-]+)\s*)*{$)
你可以在这个Rubular中测试一下.
我假设你在javaDoc的第一个注释行中有配置,我还假设你可能在这些之间随机有多个空格,你的单词/类/ids可能有-
。
您还需要什么?
编辑
This works great in Rubular. Although regex should be the same across languages, this doesn't seem to work in PHP Live Regex – Alexander 4 mins ago
你是对的,所以我将其压缩为一个匹配组和 this one seems to be working (您必须点击preg_match_all选项卡):
\/[*]{2}[\s\n\r]+\*\s@config\s(.*)[\s\n\r]+.*[\s\n\r]+\*\/[\s\n\r]+[\#\.]?([\w-]+)\s*(?:[\#\.]*([\w-]+)\s*)*{
这意味着,我正在考虑将 javaDoc 和 CSS 放在一起(javaDoc 有几行)。尽管如此,可能还需要进行一些调整。
编辑2
Thats amazing, thanks so much! What if the @config wasn't always the first entry in the comment? Is that still possible ? – Matt Bryson 7 mins ago
它是:
\/[*]{2}(?:[\s\n\r]+.*)*[\s\n\r]+\*\s@config\s(.*)[\s\n\r]+.*[\s\n\r]+\*\/[\s\n\r]+[\#\.]?([\w-]+)\s*(?:[\#\.]*([\w-]+)\s*)*{
你可以试试这个 PHP Live Regex in preg_match_all tab .
编辑3
Matt 将自己的正则表达式发展为 something simpler 。问题似乎是捕获组不能无限重复(以获取所有 CSS 类/id):
(?:[\#\.\,]([\w-]+)\s*)*
https://regex101.com/r/jM0yH0/6
因此,这个问题还需要解决...
关于php - RegEx 用于匹配 CSS 文件中的特定 javaDoc 属性,并提取有关 css 定义的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30237804/