Функция PHP для разделения объединенного атрибута/значения CSS к нескольким атрибутам

В основном я хочу это:

h2 {
    font: bold 36px/2em "Times New Roman"
}

К этому:

h2 {
    font-size: 36px;
    font-weight: bold;
    line-height: 2em;
    font-family: "Times New Roman"
}

И другие изменения, конечно. Кто-либо знает о функции, которая делает это так, я не должен кодировать ее сам?:)

5
задан Sandman 18 May 2010 в 07:00
поделиться

2 ответа

На основе этого сокращения CSS для элемента Font :

CSS Font Shorthand Style Guide

Я придумал следующее регулярное выражение:

font:(?:\s+(inherit|normal|italic|oblique))?(?:\s+(inherit|normal|small-caps))?(?:\s+(inherit|normal|bold(?:er)?|lighter|[1-9]00))?(?:\s+(\d+(?:%|px|em|pt)?|(?:x(?:x)?-)?(?:small|large)r?)|medium|inherit)(?:\/(\d+(?:%|px|em|pt)?|normal|inherit))?(?:\s+(inherit|default|.+?));?$

Получено из этих небольших регулярных выражений:

$font['style'] = '(?:\s+(inherit|normal|italic|oblique))?';
$font['variant'] = '(?:\s+(inherit|normal|small-caps))?';
$font['weight'] = '(?:\s+(inherit|normal|bold(?:er)?|lighter|[1-9]00))?';
$font['size'] = '(?:\s+(\d+(?:%|px|em|pt)?|(?:x(?:x)?-)?(?:small|large)r?)|medium|inherit)';
$font['height'] = '(?:\/(\d+(?:%|px|em|pt)?|normal|inherit))?';
$font['family'] = '(?:\s+(inherit|default|.+?))';

Использование:

$regex = 'font:' . implode('', $font) . ';?$';    
$matches = array();
$shorthand = 'font: bold 36px/2em Arial, Verdana, "Times New Roman";';

if (preg_match('~' . $regex . '~i', $shorthand, $matches) > 0)
{
    echo '<pre>';    
    if (strlen($matches[1]) > 0) { // font-style is optional
        print_r('font-style: ' . $matches[1] . ';' . "\n");
    }

    if (strlen($matches[2]) > 0) { // font-variant is optional
        print_r('font-variant: ' . $matches[2] . ';' . "\n");
    }

    if (strlen($matches[3]) > 0) { // font-weight is optional
        print_r('font-weight: ' . $matches[3] . ';' . "\n");
    }

    print_r('font-size: ' . $matches[4] . ';' . "\n"); // required

    if (strlen($matches[5]) > 0) { // line-height is optional
        print_r('line-height: ' . $matches[5] . ';' . "\n");
    }

    print_r('font-family: ' . $matches[6] . ';' . "\n"); // required
    echo '</pre>';

    echo '<pre>';
    print_r($matches);
    echo '</pre>';
}

Вывод:

font-weight: bold;
font-size: 36px;
line-height: 2em;
font-family: Arial, Verdana, "Times New Roman";

Array
(
    [0] => font: bold 36px/2em Arial, Verdana, "Times New Roman";
    [1] => 
    [2] => 
    [3] => bold
    [4] => 36px
    [5] => 2em
    [6] => Arial, Verdana, "Times New Roman"
)

Это предназначено для извлечения, а не проверки, так как он принимает такие вещи, как xx-less (что недопустимо).

Для создания расширенной версии вы можете использовать preg_match () или preg_replace () , хотя при использовании последнего будет сложнее «игнорировать» неиспользуемые объявления.

3
ответ дан 15 December 2019 в 06:19
поделиться

В PHP нет такой функции. Вы можете создать такую функцию - я бы начал с карты, содержащей [styleRuleName => [{наборы допустимых атрибутов}]] для каждого короткого селектора, который вы хотите расширить. Я думаю, что это будет немного кошмарным кодом.

0
ответ дан 15 December 2019 в 06:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: