Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Тексты > css parser


Автор: AlDev 28.12.2006, 11:03
Всем привет, подскажите плиз, как обработать css и получить из него описания стилей?

т.е. например на входе:
Код

.testClassName {
  param: value;
  param1: value;
}

на выходе имя класса и ассоциативный массив параметров:

className = ".testClassName";
params["param"] = "value";
params["param1"] = "value";

Только простейший css, как в примере.

Заранее благодарен.

Автор: -=Ustas=- 28.12.2006, 12:10
AlDev, наваял тебе элементарный примерчик, если что, то дополнишь под свои нужды smile
Код

<?php

function parser_css( &$in_string )
{
    $_CSS = array();
    
    preg_match_all( '#((?:\.|[\w-0-9]+\.)[\w-0-9]+)\s+\{(.*?)\}#is', $in_string, $matches );
    
    if ( isset( $matches[1] ) ) {
        $size = sizeof( $matches[1] );
        
        for ( $i = 0; $i < $size; $i++ ) {
            
            $matches[1][ $i ] = trim( $matches[1][ $i ] ) ;
            $pos = strpos($matches[1][ $i ], '.' );
            
            if ( $pos === 0 ) {
                
                $matches[1][ $i ] = substr( $matches[1][ $i ], 1 );
            } else {
            
                $tmp = explode( '.', $matches[1][ $i ] );
                
                $element          = $tmp[0];                
                $matches[1][ $i ] = $tmp[1];
            }
            
            $_CSS[ $matches[1][ $i ] ] = array();
            if ( isset( $element ) ) {
                $_CSS[ $matches[1][ $i ] ]['element'] = $element;
            }
            
            if ( isset( $matches[2][ $i ] ) ) {
                $matches[2][ $i ] = trim( $matches[2][ $i ] );
                preg_match_all( '#([0-9\w-]+)\s?\:\s?([0-9\w-]+)\;#is', $matches[2][ $i ], $submatches );
                
                if ( isset( $submatches[1] ) ) {
                    
                    $subsize = sizeof( $submatches[1] );
                    
                    for ( $j = 0; $j < $subsize; $j++ ) {
                        
                        $_CSS[ $matches[1][ $i ] ]['params'][ trim( $submatches[1][ $j ] ) ] = trim( $submatches[2][ $j ] );
                    }
                }
            }
            
        }
    }
    
    return $_CSS;
}

$string = '
.testClassName {
  param : value;
  param1: value;
}
.testClassName2 {
  param: value;
  param1: value;
}

div.testClassName3 {
  param: value;
  param1: value;
}';

$css = parser_css( $string );

echo '<pre>';
print_r($css);

?>


Добавлено @ 12:12 
Т.е. на входе имеем
Код

.testClassName {
  param : value;
  param1: value;
}
.testClassName2 {
  param: value;
  param1: value;
}

div.testClassName3 {
  param: value;
  param1: value;
}


На выходе имеем массив
Код

Array
(
    [testClassName] => Array
        (
            [params] => Array
                (
                    [param] => value
                    [param1] => value
                )

        )

    [testClassName2] => Array
        (
            [params] => Array
                (
                    [param] => value
                    [param1] => value
                )

        )

    [testClassName3] => Array
        (
            [element] => div
            [params] => Array
                (
                    [param] => value
                    [param1] => value
                )

        )

)


Автор: Mal Hack 28.12.2006, 15:27
Для подсветке кода, вытаскивания всего, использовал такой паттерн:
Код
"#(\/\*.*?\*\/)|(&lt;!--.+?--&gt;)|([A-Z]*(\#|\.)[A-Z0-9\-_]+)|(hover|active|link|visited|after)|([A-Z\-|]+\s*:\s*[^\{]+?(;|\}|$))|(@{0,1}[A-Z0-9]+(\s|,|\{|\:))#is"


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)