PHP CSS Parser - объявления селектора в строку

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

h1 {
  font-size: 15px;
  font-weight: bold;
  font-style: italic;
  font-family: Verdana, Arial, Helvetica, sans-serif;
}

div.item {
  font-size: 12px;
  border:1px solid #EEE;
}

Я хочу иметь возможность позвонить и получить div.item, что-то вроде:

$css->getSelector('div.item');

Что должно дать мне строку вроде:

font-size:12px;border:1px solid #EEE;

Я искал вокруг, но не могу найти парсер, который может сделать именно это. Есть идеи?

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

РЕДАКТИРОВАНИЕРЕШЕНИЯ: Я придумал свое собственное грубое решение и создал класс, чтобы делать то, что я искал. Смотрите мой собственный ответ ниже.

2 ответа

Решение

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

class css2string {
    var $css;

    function parseStr($string) {
        preg_match_all( '/(?ims)([a-z0-9, \s\.\:#_\-@]+)\{([^\}]*)\}/', $string, $arr);
        $this->css = array();
        foreach ($arr[0] as $i => $x)
        {
            $selector = trim($arr[1][$i]);
            $rules = explode(';', trim($arr[2][$i]));
            $this->css[$selector] = array();
            foreach ($rules as $strRule)
            {
                if (!empty($strRule))
                {
                    $rule = explode(":", $strRule);
                    $this->css[$selector][trim($rule[0])] = trim($rule[1]);
                }
            }
        }
    }

    function arrayImplode($glue,$separator,$array) {
        if (!is_array($array)) return $array;
        $styleString = array();
        foreach ($array as $key => $val) {
            if (is_array($val))
                $val = implode(',',$val);
            $styleString[] = "{$key}{$glue}{$val}";

        }
        return implode($separator,$styleString);   
    }

    function getSelector($selectorName) {
        return $this->arrayImplode(":",";",$this->css[$selectorName]);
    }

}

Вы можете запустить его следующим образом:

$cssString = "
h1 {
  font-size: 15px;
  font-weight: bold;
  font-style: italic;
  font-family: Verdana, Arial, Helvetica, sans-serif;
}

div.item {
  font-size: 12px;
  border:1px solid #EEE;
}";

$getStyle = new css2string();
$getStyle->parseStr(cssString);
echo $getStyle->getSelector("div.item");

Вывод будет следующим:

font-size:12px;border:1px solid #EEE

Это решение работает даже с комментариями в вашем CSS-файле, если комментарии не находятся внутри селекторов.

Ссылки: http://www.php.net/manual/en/function.implode.php http://stackru.com/questions/1215074/break-a-css-file-into-an-array-with-PHP

Я думаю, это то, что вы ищете:

http://classes.verkoyen.eu/css_to_inline_styles

CssToInlineStyles - это класс, который позволяет вам конвертировать HTML-страницы / файлы в HTML-страницы / файлы со встроенными стилями. Это очень полезно, когда вы отправляете электронные письма. Я использую это прямо сейчас и отлично работает.

Пример использования некоторых методов:

$html = file_get_contents('blue.html');

// мои стили хранятся в HTML

$cssConverter = new CSSToInlineStyles();
$cssConverter->setCleanup(true);
$cssConverter->setHTML($html);
$cssConverter->convert(true);
$cssConverter->setUseInlineStylesBlock(true);

$new_html = $cssConverter->convert();
Другие вопросы по тегам