2010-05-18 8 views
5

Grundsätzlich aufzuspalten, ich will dies:PHP-Funktion eine kombinierte CSS-Attribut/Wert auf mehrere Attribute

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

Um dies:

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

und andere Variationen, natürlich. Kennt jemand eine Funktion, die das tut, so muss ich es nicht selbst programmieren? :)

+2

Ich möchte eine Funktion haben, die umgekehrt tut .. –

+1

@Alix Axel: Yup das ist die bessere Wahl und logischer :) – Sarfraz

+0

Ja, ich möchte es in beide Richtungen verwalten, natürlich :) – Sandman

Antwort

3

Basierend auf diesen CSS Shorthand for the Font Element:

CSS Font Shorthand Style Guide

Ich habe mit dem folgenden regulären Ausdruck kommt:

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|.+?));?$ 

von diesem kleineren regulären Ausdrücken:

$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|.+?))'; 

Verbrauch:

$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>'; 
} 

Ausgang:

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" 
) 

Diese für die Extraktion nicht Validierung gemeint ist, da es Sachen wie xx-kleiner akzeptiert (die nicht gültig ist).

Um die erweiterte Version zu erstellen, können Sie entweder preg_match() oder preg_replace() verwenden, obwohl die Verwendung letzterer schwieriger wäre, nicht verwendete Deklarationen zu "ignorieren".

+0

Danke! Ich werde weiter darauf eingehen! – Sandman

+0

@Sandman: Gern geschehen. :) –

0

Es gibt keine solche Funktion in PHP. Sie könnten eine solche Funktion erstellen - ich würde mit einer Map beginnen, die [styleRuleName => [{Sätze gültiger Attribute}]] für jeden Shorthand-Selektor enthält, den Sie erweitern möchten. Ich denke, Sie werden feststellen, dass dies ein Albtraum für Code ist.

+1

Of Natürlich gibt es keine eingebaute Funktion, ich meinte eine Drittanbieter-Funktion. Ich könnte es natürlich selbst programmieren, aber ich will nicht :) – Sandman

+0

Nicht bewusst, dass eine solche Funktion von Drittanbietern auch nicht. Die meisten Menschen befassen sich damit, Attribute zu kombinieren, nicht zu erweitern. – Finbarr

Verwandte Themen