Мне нужно получить / установить значения переменных Scss из PHP из файла переменных Scss.
Прямо к образцу:
// $mainColor: #fafafa;
//$mainColor : #a375c1;
$mainColor: #b3e287;
$mainColor: #ac3190; // <- This is the value I'd like to grab/set
$boxColor: ligthen($mainColor, 10%);
Из файла вроде этого (я знаю имя переменной заранее) я хотел бы иметь возможность получить / установить переменную из 4-й строки, теперь проблема заключается в том, что мне нужно игнорировать переменную, если она закомментирована, или впоследствии если ему не присваивается значение. Я думаю, что лучший способ добиться этого — это комбинация strpos и Regex, я просто недостаточно разбираюсь в regex, чтобы правильно использовать отрицательный прогноз или найти последнюю итерацию присвоения переменной.
После того, как я сопоставлю переменную, мне более чем легко очистить / обрезать значение, не нужно совпадать, является ли оно шестнадцатеричным или нет, просто действительно что-нибудь перехватить между :
а также ;
Итак, еще раз, имя переменной известно.
Следующий фрагмент работает и показывает, как сделать большую часть того, что вы просите.
<?php
$contents = file('file.scss'); //array with lines from file
$linenum = 0;
foreach($contents as $key=>$line)
{
// a line can start with 0 or more spaces, then // (maybe, maybe not), then 0 or more space, then something entirely unknown, then a : then something entirely unknown and then a ;
//[0] = the whole line [1] = the // or not [2] is the variablename [3] = the variabel value
if (preg_match('/[ ]*([\/]{2})?[ ]*(.*?):(.*?);/is', $line, $matches))
{
$variablename = $matches[2];
$variablevalue = $matches[3];
if ($variablename == '$myvar')
{
if ($matches[1] != '//') //if it is not commented out
$contents[$key] = '$mainColor: red;'; //replace the whole line, if you want to replace only the color you can maybe use str_replace to replace the $variablevalue to something else?
//$contents[$key] = str_replace($variablevalue, 'red', $line); // this line is untested
break;
}
}
}
//do something with the result:
echo implode($contents);
Изменить: я изменил сценарий после комментария.
Других решений пока нет …