- Перерыв CSS-файла в массив с PHP
- pepesantos / css2Array.php
- PHP CSS из строки в массив
- Решение
- Другие решения
- PHP CSS from string to array
- Solution:
- Answer
- Solution:
- Share solution ↓
- Additional Information:
- Didn't find the answer?
- Similar questions
- Write quick answer
- About the technologies asked in this question
- PHP
- CSS
- Welcome to programmierfrage.com
- Get answers to specific questions
- Help Others Solve Their Issues
Перерыв CSS-файла в массив с PHP
Краткое пояснение: Регулярное выражение простое и скучное. Он просто соответствует всем «всем, возможному пространству, фигурной скобке, возможному пространству, чему угодно, закрывает фигурные скобки». Оттуда первое совпадение является селектором, второе совпадение – списком атрибутов. Разделите это точкой с запятой, и вы останетесь с парами ключ / значение. Некоторые trim () там, чтобы избавиться от пробелов, и это все.
Я предполагаю, что ваша следующая лучшая ставка, вероятно, заключалась бы в том, чтобы взорвать селектор запятой, чтобы вы могли консолидировать атрибуты, относящиеся к одной и той же вещи и т. Д., Но я сохраню это для вас. 🙂
Edit: Как уже упоминалось выше, реальный грамматический анализатор был бы более практичным … но если вы принимаете хорошо сформированный CSS, нет причин, по которым вам нужно делать что-либо сверх простейшего из «ничего ». На самом деле зависит от того, что вы хотите с этим делать.
Если вам нужно то же самое для правил CSS с несколькими селекторами и с разделительными линиями:
#selector a:hover div.asd, #asd h1.asd < float:left; text-decoration:none; >"; preg_match_all( '/(?ims)([a-z0-9\s\,\.\:#_\-@]+)\<([^\>]*)\>/', $css, $arr); $result = array(); foreach ($arr[0] as $i => $x) < $selector = trim($arr[1][$i]); $rules = explode(';', trim($arr[2][$i])); $result[$selector] = array(); foreach ($rules as $strRule) < if (!empty($strRule)) < $rule = explode(":", $strRule); $result[$selector][][trim($rule[0])] = trim($rule[1]); >> > var_dump($result); ?>
array(2) < ["#selector"]=>array(2) < [0]=>array(1) < ["display"]=>string(5) "block" > [1]=> array(1) < ["width"]=>string(5) "100px" > > ["#selector a:hover div.asd, #asd h1.asd"]=> array(2) < [0]=>array(1) < ["float"]=>string(4) "left" > [1]=> array(1) < ["text-decoration"]=>string(4) "none" > > >
Обновление: добавлена поддержка нескольких селекторов, таких как: .box, .element, div
Если бы я был вами, я бы построил (или нашел) настоящую грамматику для CSS и разбирался таким образом. Попытка написать парсер для любого нетривиального языка выражений (а CSS явно не тривиальна, со всеми фантастическими селекторами) заставила меня беспокоиться более чем достаточно раз.
Я бы предложил селектор (?ims)([a-z0-9\s\,\.\:#_\-@*()\[\]»=]+)\<([^\>]*)\> в ответе inakiabt для лучшего решения.
pepesantos / css2Array.php
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
/** |
* css2Array() |
* Converts css to php array |
* |
* @param string $css_string |
* @return array css definition indexed by class (selector) |
* |
* @example |
* $css = css2array( file_get_contents(‘css/css.css’) ); |
* // returns array(‘.class1’= > ‘padding:0;color;red’. ) |
* |
* @TODO nested <> in css definition |
*/ |
function css2Array($css_string) |
$results = array(); |
$css = str_replace(array(«\r»,»\n»,»!important»),array(» «,» «,»»),$css_string); |
$css = preg_replace(«/\s+/muU», » «, $css); |
$css = preg_replace(«~/\*[\s\S]*\*/~muU», «», $css); |
preg_match_all(‘/([^\]+)\s*\<\s*([^>]+)\s*>/muU’, $css, $matches); |
foreach($matches[0] AS $i= > $original) |
$ta = explode(«,», $matches[1][$i]); |
foreach($ta as $c) |
$class = trim($c); |
foreach(explode(‘;’, $matches[2][$i]) AS $attr) |
if(strlen(trim($attr)) > 0 && stripos($attr,»:»)!==FALSE) |
list($name, $value) = explode(‘:’, $attr); |
$results[$class][trim($name)] = trim($value); |
> |
> |
> |
return $results; |
> |
PHP CSS из строки в массив
Это должно быть как-то просто, но я не могу понять это и занимаюсь этим уже весь день.
Я хочу проанализировать файл CSS в массив с ключами и значениями, как это:
Array('#idname' => Array('overflow' => hidden, 'color' => '#FFF'));
Я игнорирую все медиазапросы, удаляя их с помощью регулярного выражения, а также удаляю все пробелы.
//Remove all media queries $cssFromLink = preg_replace("/@media.*?>>/i", '', $cssFromLink); //Remove all whitespace $cssFromLink = str_replace(' ','', $cssFromLink);
Все, что я хочу, это иметь возможность искать в списке идентификатор или имя класса, а затем извлекать свойство, например background-color.
Такие библиотеки, как Sabberworm и другие парсеры CSS, похоже, не работают для меня, они либо кажутся вечными / ничего не делают, либо выдают фатальную ошибку. Я пытаюсь это на CSS от Apple.com.
Все остальные решения выглядят для меня одинаково сложными, но почти ни одно из них не работает специально для apple.com, и я не могу его вывести из строя на популярных веб-сайтах.
Решение
Ответ от JapanPro на Разобрать файл CSS с помощью PHP работает лучше для меня. В нем все еще есть некоторые ошибки (a> перед некоторыми идентификаторами), и я не уверен, является ли использование regex лучшим способом для его анализа в любой ситуации, но сейчас я буду использовать это.
#selector a < float:left; text-decoration:none >CSS; // function BreakCSS($css) < $results = array(); preg_match_all('/(.+?)\s?\<\s?(.+?)\s?\>/', $css, $matches); foreach($matches[0] AS $i=>$original) foreach(explode(';', $matches[2][$i]) AS $attr) if (strlen($attr) > 0) // for missing semicolon on last element, which is legal < // Explode on the CSS attributes defined list($name, $value) = explode(':', $attr); $results[$matches[1][$i]][trim($name)] = trim($value); >return $results; > var_dump(BreakCSS($css));
Другие решения
Я только что сделал это, попробуйте:
#id2 < margin: 0px; height: 100%; >"; //Call the function and print it out $css_array = cssToArray($string); echo ""; print_r($css_array); //The actual function function cssToArray($css)< //Regex to find tags and their rules $re = "/(.+)\<([^\>]*)\>/"; preg_match_all($re, $css, $matches); //Create an array to hold the returned values $return = array(); for($i = 0; $i > //Add the name and its values to the array $return[$name] = $rules_a; > //Return the array return $return; >
PHP CSS from string to array
Solution:
The answer from JapanPro at Parse a CSS file with PHP works the best for me. It still has some errors (a > is in front of some id's) and i'm not sure if using regex is the best way to parse it for every situation but for now I will use this.
#selector a < float:left; text-decoration:none >CSS; // function BreakCSS($css) < $results = array(); preg_match_all('/(.+?)\s?\<\s?(.+?)\s?\>/', $css, $matches); foreach($matches[0] AS $i=>$original) foreach(explode(';', $matches[2][$i]) AS $attr) if (strlen($attr) > 0) // for missing semicolon on last element, which is legal < // Explode on the CSS attributes defined list($name, $value) = explode(':', $attr); $results[$matches[1][$i]][trim($name)] = trim($value); >return $results; > var_dump(BreakCSS($css));
Answer
Solution:
I just made this, try it out:
#id2 < margin: 0px; height: 100%; >"; //Call the function and print it out $css_array = cssToArray($string); echo ""; print_r($css_array); //The actual function function cssToArray($css)< //Regex to find tags and their rules $re = "/(.+)\<([^\>]*)\>/"; preg_match_all($re, $css, $matches); //Create an array to hold the returned values $return = array(); for($i = 0; $i > //Add the name and its values to the array $return[$name] = $rules_a; > //Return the array return $return; >
Share solution ↓
Additional Information:
Didn't find the answer?
Our community is visited by hundreds of web development professionals every day. Ask your question and get a quick answer for free.
Similar questions
Find the answer in similar questions on our website.
Write quick answer
Do you know the answer to this question? Write a quick response to it. With your help, we will make our community stronger.
About the technologies asked in this question
PHP
PHP (from the English Hypertext Preprocessor - hypertext preprocessor) is a scripting programming language for developing web applications. Supported by most hosting providers, it is one of the most popular tools for creating dynamic websites. The PHP scripting language has gained wide popularity due to its processing speed, simplicity, cross-platform, functionality and distribution of source codes under its own license.
https://www.php.net/
CSS
CSS (Cascading Style Sheets) is a formal language for describing the appearance of a document written using a markup language. It is mainly used as a means of describing, decorating the appearance of web pages written using HTML and XHTML markup languages, but can also be applied to any XML documents, such as SVG or XUL.
https://www.w3.org/TR/CSS/#css
Welcome to programmierfrage.com
programmierfrage.com is a question and answer site for professional web developers, programming enthusiasts and website builders. Site created and operated by the community. Together with you, we create a free library of detailed answers to any question on programming, web development, website creation and website administration.
Get answers to specific questions
Ask about the real problem you are facing. Describe in detail what you are doing and what you want to achieve.
Help Others Solve Their Issues
Our goal is to create a strong community in which everyone will support each other. If you find a question and know the answer to it, help others with your knowledge.