Парсинг CSS regex

Почему бы не попытаться использовать уникальное имя файла? Таким образом, вы уверены, что не будет столкновения имен. Взгляните на https://docs.python.org/2/library/tempfile.html , рассмотрите функцию NamedTeoraryFile. Вы должны использовать delete = False, в противном случае файл сразу удаляется после закрытия ().

12
задан molf 30 May 2010 в 22:18
поделиться

6 ответов

Это просто кажется слишком замысловатым для единственного регулярного выражения. Ну, я уверен, что с правильными расширениями, опытный пользователь мог создать право regex. Но затем Вам было бы нужно еще больше опытного пользователя для отладки его.

Вместо этого я предложил бы использовать regex, чтобы вытащить части и затем маркировать каждую часть отдельно. например,

/([^{])\s*\{\s*([^}]*?)\s*}/

Затем Вы заканчиваете с селектором и атрибутами в отдельных полях, и затем разделяете их. (Даже селектор будет забавой проанализировать.) Отмечают, что даже это будет страдать от болей, если}'s может появиться в кавычках или чем-то. Вы могли, снова, свернутый heck из него, чтобы избежать этого, но, вероятно, еще лучше избежать regex's в целом здесь и обработать его путем парсинга одного поля за один раз, возможно, при помощи синтаксического анализатора с рекурсивным спуском или yacc/bison или что бы то ни было.

19
ответ дан 2 December 2019 в 02:57
поделиться

Я рекомендовал бы против использования regex's проанализировать CSS - особенно в единственном regex!

Если Вы настаиваете на том, чтобы делать парсинг в regex's, разводитесь, он в разумные разделы - использует один regex для разделения весь body{..} блоки, затем другой для парсинга color:rgb(1,2,3); атрибуты.

Если Вы на самом деле пытаетесь записать что-то "полезное" (не пытающийся изучить регулярные выражения), ищите предзаписанный синтаксический анализатор CSS.

Я нашел этот cssparser.php, который, кажется, работает очень хорошо:

$cssp = new cssparser;
$cssp -> ParseStr("body { background: #f00;font: 12px Arial; }");
print_r($cssp->css);

.. который производит следующее:

Array
(
    [body] => Array
        (
            [background] => #f00
            [font] => 12px arial
        )
)

Синтаксический анализатор довольно прост, так должно быть легко разработать то, что он делает. О, я должен был удалить строки, которые читают if($this->html) {$this->Add("VAR", "");} (это, кажется, вещь отладки, которая была оставлена внутри),

Я зеркально отразил сценарий здесь с вышеупомянутыми изменениями в

8
ответ дан 2 December 2019 в 02:57
поделиться

Вы пытаетесь вытащить структуру из данных и не только отдельные значения. Сила регулярных выражений могла быть мучительно расширена, чтобы сделать задание, но Вы действительно вводите территорию синтаксического анализатора и должны вытаскивать большие пушки, а именно, синтаксические анализаторы.

Я никогда не использовал генерирующиеся инструменты синтаксического анализатора PHP, но они смотрят хорошо после легкого сканирования документов. Проверьте LexerGenerator и ParserGenerator. LexerGenerator возьмет набор регулярных выражений, описывающих различные типы маркеров на языке (в этом случае, CSS), и выложит некоторый код, который распознает отдельные маркеры. ParserGenerator возьмет грамматику, описание того, какие вещи на языке составлены из того, что другие вещи, и выкладывает синтаксический анализатор, код, который берет набор маркеров и возвращает синтаксическое дерево (структура данных, что Вы после.

10
ответ дан 2 December 2019 в 02:57
поделиться

Не используйте собственное регулярное выражение для синтаксического анализа CSS. Зачем изобретать велосипед, пока вас ждет код, готовый к использованию и (надеюсь) без ошибок?

Есть два общедоступных класса, которые могут анализировать CSS за вас:

пакет HTML_CSS PEAR на pear.php.net

и

класс синтаксического анализатора CSS на PHPCLasses:

http: // www. phpclasses.org/browse/package/1289.html

10
ответ дан 2 December 2019 в 02:57
поделиться

Я использую приведенное ниже регулярное выражение, и оно в значительной степени работает ... конечно, этот вопрос уже устарел, и я вижу, что вы отказались от своих усилий ... но на случай, если кто-то еще столкнется с ним:

(?<selector>(?:(?:[^,{]+),?)*?)\{(?:(?<name>[^}:]+):?(?<value>[^};]+);?)*?\}

( hafta сначала удалите все / * комментарии * / из вашего CSS)

6
ответ дан 2 December 2019 в 02:57
поделиться

Попробуйте это

function trimStringArray($stringArray){
    $result = array();
    for($i=0; $i < count($stringArray); $i++){
        $trimmed = trim($stringArray[$i]);
        if($trimmed != '') $result[] = $trimmed;
    }
    return $result;
}
$regExp = '/\{|\}/';
$rawCssData = preg_split($regExp, $style);

$cssArray = array();
for($i=0; $i < count($rawCssData); $i++){
    if($i % 2 == 0){
        $cssStyle['selectors'] = array();
        $selectors = split(',', $rawCssData[$i]);
        $cssStyle['selectors'] = trimStringArray($selectors);
    }
    if($i % 2 == 1){
        $attributes = split(';', $rawCssData[$i]);
        $cssStyle['attributes'] = trimStringArray($attributes);
        $cssArray[] = $cssStyle;
    }

}
//return false;
echo '<pre>'."\n";
print_r($cssArray);
echo '</pre>'."\n";
0
ответ дан 2 December 2019 в 02:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: