PHP: заменить свойство CSS в Regex - PullRequest
0 голосов
/ 29 августа 2011

Я пытаюсь проанализировать CSS с помощью Regex и заменить определенные значения в PHP.

В настоящее время я могу анализировать файлы CSS с помощью найденного класса "CSS Parser" здесь .

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

Пример

.marked     p

Будетне нужно анализировать, поэтому мне пришлось его удалить.

Существует ли доступное регулярное выражение, которое можно использовать вместе с preg_replace, которое может его достичь?

1 Ответ

1 голос
/ 29 августа 2011

Этот шаблон находит все селекторы и превращает правила в массивы ключ-значение. Он должен работать на хорошо сформированном CSS, в противном случае может потребоваться некоторая настройка.

Идея состоит в том, что в CSS не будет ничего, кроме селекторов в скобках правил. Он ищет строку, пока не доходит до начального скобка, и интерпретирует ее как селектор. Таким образом, он в основном ищет «not {», и когда он достигает {, он знает, что нашел селектор. Из-за этого он может некорректно обрабатывать @import с, но это также может быть учтено.

Код взят из моего CSS-компилятора и парсера , который получил много идей от Андреаса Лагерквиста

function callback($match)
{
    // Normalize whitespace from selector
    $selector = trim(preg_replace('/\s\s+/', ' ', $match[1]));

    // Turn the rules into key-value array
    $rules_str = str_replace(array('{', '}'), '', trim(preg_replace('/\s\s+/', ' ', $match[2])));
    $rules_pieces = explode(';', $rules_str);
    $rules = array();

    foreach ( $rules_pieces as $rule )
    {
        // No key-value pair?
        if ( ! strstr($rule, ':') ) continue;

        list($key, $value) = explode(':', trim($rule));
        $rules[$key] = trim($value);
    }

    // Do some stuff
    echo $selector . PHP_EOL;
}

$css = "
    body {
            font: foo; size: 1px; 
    }

    #foo .bar div {
            foo: bar;
            foooo: bar;
    }  

    #foo    .bar div { foo: bar; }
";

preg_replace_callback('/([^{;]+)(\{[^}]+\})/', 'callback', $css);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...