PHP CSS парсер не может разобрать точку с запятой в значениях свойств

0

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

#logo {
    background-image: url("data:image/png;base64,..................");
}

Я изменил разделитель разрыва на "\n", но он не дал ожидаемых результатов. Пожалуйста помоги.

Функция:

function parse($file){
    $css = file_get_contents($file);
    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]));
        $rules_arr = array();
        foreach ($rules as $strRule){
            if (!empty($strRule)){
                $rule = explode(":", $strRule);
                $rules_arr[trim($rule[0])] = trim($rule[1]);
            }
        }

        $selectors = explode(',', trim($selector));
        foreach ($selectors as $strSel){
            $result[$strSel] = $rules_arr;
        }
    }
    return $result;
}

Исполнение:

$css = parse('content/custom.css');
echo print_r($css);
  • 0
    что должен делать метод? в чем разница между вашей функцией parse и непосредственным отображением файла css? Это не сразу видно из кода
  • 1
    @chiliNUT: этот метод предоставляет массив, и он не совпадает с echo. [#logo] => Array ( [background-image] => url("data [base64,...................")] => [background-size] => auto 100% ) . Я пытаюсь получить действительное значение свойства для background-image . знак равно
Показать ещё 3 комментария
Теги:
parsing

1 ответ

0

Как насчет того, чтобы использовать временную строку владельца места для offsensive ;base64, затем выполнить разделение, а затем восстановить его, что-то вроде:

Заменить эту строку:

 $rules = explode(';', trim($arr[2][$i]));

с этим:

//replace ;base64 with a placeholder
$placeholder=uniqid();
$arr[2][$i] = str_replace(";base64",$placeholder,$arr[2][$i]);
//explode
$rules = explode(';', trim($arr[2][$i]));
//restore from placeholder
$rules = array_map(function ($el) {
    return str_replace($placeholder, ";base64", $el);
}, $rules);
  • 0
    Что делать, если вместо base64 будет что-то еще? Это не очень надежное решение ... =)
  • 0
    Какие есть другие исключения, где точка с запятой не обозначает конец стиля, кроме; base64?
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню