正则表达式匹配 CSS 文件中的特定 javaDoc 属性,并提取有关 css 定义的数据
RegEx to match specific javaDoc attribute in a CSS file, and extract data about the css defintion
我正在尝试存储一些关于 CSS 样式的元数据,我们的应用程序可以使用这些元数据来构建允许用户 select 这些样式(以及其他内容)的菜单。
我认为 JavaDoc 样式注释是最好的方法,并使用像 config
或类似的属性。然后将 JSON 样式定义存储为 属性.
的值
我一直在尝试编写一些 RegEx (PHP) 来执行以下操作:
- 查找所有具有
@config
属性的 JavaDoc 注释。
- 提取
@config
的值作为JSON对象
- 然后匹配下面的css TAG和CLASS名称,如果它们定义在它下面。
所以这个评论和 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 的第一个注释行中有配置,我还假设你可能在这些之间随机有多个空格,你的 words/classes/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 classes/ids):
(?:[\#\.\,]([\w-]+)\s*)*
https://regex101.com/r/jM0yH0/6
因此,这个问题还需要解决...
我正在尝试存储一些关于 CSS 样式的元数据,我们的应用程序可以使用这些元数据来构建允许用户 select 这些样式(以及其他内容)的菜单。
我认为 JavaDoc 样式注释是最好的方法,并使用像 config
或类似的属性。然后将 JSON 样式定义存储为 属性.
我一直在尝试编写一些 RegEx (PHP) 来执行以下操作:
- 查找所有具有
@config
属性的 JavaDoc 注释。 - 提取
@config
的值作为JSON对象 - 然后匹配下面的css TAG和CLASS名称,如果它们定义在它下面。
所以这个评论和 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 的第一个注释行中有配置,我还假设你可能在这些之间随机有多个空格,你的 words/classes/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 classes/ids):
(?:[\#\.\,]([\w-]+)\s*)*
https://regex101.com/r/jM0yH0/6
因此,这个问题还需要解决...