Я пытаюсь сохранить некоторые метаданные о стилях CSS, которые наше приложение может использовать для создания меню, позволяющего пользователю выбирать эти стили (среди прочего).
Я думал, что комментарий в стиле JavaDoc был лучшим подходом, и я использовал такой атрибут, как config
или похожие. Затем сохраните определение стиля JSON как значение этого свойства.
Я пытался написать некоторый RegEx (PHP), чтобы сделать следующее:
@config
приписывать.@config
как объект JSONТаким образом, этот комментарий и определение класса могут быть выделены в 3 совпадения.
/**
* @config {name:'Orange Title', order:1}
*/
h1.title_orange {
}
{name:'Orange Title', order:1}
h1
title_orange
Что делает его более сложным, так это то, что часть JSON может быть многострочной, а мультилинии могут содержать или не содержать *
,
Самая большая задача состоит в предположениях, которые вы делаете (какие вещи тестировать):
(?:^\/\*\*[\s\n\r]+\*\s@config\s(.*)$|^\s+\*\/[\s\n\r]+[\#\.]?([\w-]+)\s*(?:[\#\.]*([\w-]+)\s*)*{$)
Вы можете проверить это в этом Rubular.
Я предположил, что у вас есть config в первой строке комментария javaDoc, я также предположил, что у вас может быть несколько пробелов между ними, что ваши слова / классы / идентификаторы могут иметь -
,
Что еще тебе нужно?
Это прекрасно работает в Rubular. Хотя регулярные выражения должны быть одинаковыми для разных языков, похоже, это не работает в PHP Live Regex — Александр 4 минуты назад
Вы правы, поэтому я спрессовал его в одну матчевую группу и кажется, этот работает (Вы должны нажать 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 с несколькими строками). Тем не менее, могут быть корректировки, которые необходимо внести.
Это удивительно, спасибо большое! Что если @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*)*{
Вы можете попробовать это PHP Live Regex в preg_match_all табуляция.
Мэтт развил свое собственное регулярное выражение что-то более простое. Кажется, проблема в том, что группы захвата не могут повторяться бесконечно с этим (чтобы получить все классы / идентификаторы CSS):
(?:[\#\.\,]([\w-]+)\s*)*
https://regex101.com/r/jM0yH0/6
Поэтому это все еще нужно решить …
Других решений пока нет …