Я хочу, чтобы иметь возможность читать 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;
Я смотрю вокруг, но не могу найти парсер, который может это сделать. Есть идеи?
FYI: Мне нужно это, чтобы иметь возможность конвертировать селектора из CSS и динамически вставлять стили в элементы HTML в сообщениях электронной почты.
РЕШЕНИЕ РЕДАКТИРОВАНИЯ: Я придумал свое собственное сырое решение и создал класс, чтобы делать то, что я искал. См. Мой собственный ответ ниже.
Я думаю, это то, что вы ищете:
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();
Я придумал свое собственное грубое решение и создал класс, чтобы делать то, что я искал. На мои источники ссылаются внизу.
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#106085 http://stackoverflow.com/questions/1215074/break-a-css-file-into-an-array-with -PHP