Ben kendi CSS ayrıştırıcı ve filtre yazmak için gidiyoruz sanırım, yani ben böyle bir şey yapmadım, ancak burada, ben düşünün ne:
- Kullanıcıların kullanabilirsiniz kabul CSS özelliklerinin (beyaz) listesini yapın. Gibi:
color
, font-family
.
- Ben bunu kolayca değerleri ayrıştırmak böylece, en azından başlangıçta, bu tür
background
gibi kısa el formları izin vermemek için daha iyi olabilir inanıyoruz. Onlar açıkça yazmak gerektirir background-color
, background-image
.
- URL'leri istiyorsanız, sadece göreli URL'ler, izin ve hatta yakından bir URL gibi görünmüyor her şeyi atın. Eğer ayrıştırıcı ve doğrulayıcı geliştirmek, böylece, zaten bu konuları açın.
- Lütfen ayrıştırma çok sıkı olması, sizin ayrıştırıcı geçerli CSS olacağını bile anlamıyor her şeyi atın. Diğer bir deyişle, kendi CSS alt kümesini yapmak.
Ayrıştırma zaman zor kısmı complex CSS selectors ayrıştırma olacaktır. Ama sen de burada kendi alt kümesini empoze edebilirsiniz.
İşte bazı (sözde) kodu belki bir şekilde size yardımcı olacaktır, var:
<?php
function tokenizeCSS() {
return array(
array(
'selector' => '#foo .bar',
'properties' => array(
'background-color' => 'transparent',
'color' => '#fff',
),
);
);
}
function colorValidator($color)
{}
/**
* This is basically the white list. Keys are accepted CSS properties
* and values are the validator callbacks.
*/
$propertyValidators = array(
'background-color' => 'colorValidator',
'color' => 'colorValidator',
);
$filteredRules = array();
foreach (tokenizeCSS() as $rule) {
if (! validSelector($rule['selector'])) {
continue;
}
foreach ($rule['properties'] as $property => $value) {
/**
* Check property is in white list
*/
if (! isset($propertyValidators[$property]) {
continue;
}
/**
* Check property is valid
*/
if (! $propertyValidators[$property]($value)) {
continue;
}
/**
* Valid rule
*/
$filteredRules[$rule['selector']][$property] = $value;
}
}