Почему бы не попытаться использовать уникальное имя файла? Таким образом, вы уверены, что не будет столкновения имен. Взгляните на https://docs.python.org/2/library/tempfile.html , рассмотрите функцию NamedTeoraryFile. Вы должны использовать delete = False, в противном случае файл сразу удаляется после закрытия ().
Это просто кажется слишком замысловатым для единственного регулярного выражения. Ну, я уверен, что с правильными расширениями, опытный пользователь мог создать право regex. Но затем Вам было бы нужно еще больше опытного пользователя для отладки его.
Вместо этого я предложил бы использовать regex, чтобы вытащить части и затем маркировать каждую часть отдельно. например,
/([^{])\s*\{\s*([^}]*?)\s*}/
Затем Вы заканчиваете с селектором и атрибутами в отдельных полях, и затем разделяете их. (Даже селектор будет забавой проанализировать.) Отмечают, что даже это будет страдать от болей, если}'s может появиться в кавычках или чем-то. Вы могли, снова, свернутый heck из него, чтобы избежать этого, но, вероятно, еще лучше избежать regex's в целом здесь и обработать его путем парсинга одного поля за один раз, возможно, при помощи синтаксического анализатора с рекурсивным спуском или yacc/bison или что бы то ни было.
Я рекомендовал бы против использования 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", "");}
(это, кажется, вещь отладки, которая была оставлена внутри),
Я зеркально отразил сценарий здесь с вышеупомянутыми изменениями в
Вы пытаетесь вытащить структуру из данных и не только отдельные значения. Сила регулярных выражений могла быть мучительно расширена, чтобы сделать задание, но Вы действительно вводите территорию синтаксического анализатора и должны вытаскивать большие пушки, а именно, синтаксические анализаторы.
Я никогда не использовал генерирующиеся инструменты синтаксического анализатора PHP, но они смотрят хорошо после легкого сканирования документов. Проверьте LexerGenerator и ParserGenerator. LexerGenerator возьмет набор регулярных выражений, описывающих различные типы маркеров на языке (в этом случае, CSS), и выложит некоторый код, который распознает отдельные маркеры. ParserGenerator возьмет грамматику, описание того, какие вещи на языке составлены из того, что другие вещи, и выкладывает синтаксический анализатор, код, который берет набор маркеров и возвращает синтаксическое дерево (структура данных, что Вы после.
Не используйте собственное регулярное выражение для синтаксического анализа CSS. Зачем изобретать велосипед, пока вас ждет код, готовый к использованию и (надеюсь) без ошибок?
Есть два общедоступных класса, которые могут анализировать CSS за вас:
пакет HTML_CSS PEAR на pear.php.net
и
класс синтаксического анализатора CSS на PHPCLasses:
Я использую приведенное ниже регулярное выражение, и оно в значительной степени работает ... конечно, этот вопрос уже устарел, и я вижу, что вы отказались от своих усилий ... но на случай, если кто-то еще столкнется с ним:
(?<selector>(?:(?:[^,{]+),?)*?)\{(?:(?<name>[^}:]+):?(?<value>[^};]+);?)*?\}
( hafta сначала удалите все / * комментарии * / из вашего CSS)
Попробуйте это
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";