Autor Zpráva
nethor
Profil
Zdravím,
mám poměrně velké html soubory (třeba 200Kb), u kterých potřebuji převést externí css na inline. (To je kvůli možnosti otevření a dalšímu zpracování ve Wordu.)
K této operaci používám Simplehtmldom simplehtmldom.sourceforge.net/manual.htm , ale při převodu některých souborů mi začal padat Apache jak na localu, tak na ostrém serveru.

Přemýšlím, jak provést převod šetrnějším, efektivnějším způsobem.
Je něco výhodnějšího, než Simplehtmldom nebo stačí ošetřit vypráznění paměti? ..či jít na to úplně jinak, třeba přes preg_replace?

Klíčová část zdroje:

$SimpleHtmlDom = new simple_html_dom();
    
$SimpleHtmlDom->load($Html);

$SimpleHtmlDom = Css::Add2SimpleHtmlDom($SimpleHtmlDom,"css/_styl_doc_test.css")    ; // základní doplnění inline stylů z CSS

echo $SimpleHtmlDom  ;  

// ----------------

class Css  { 

static public function ToArr($Text){   // převedení stylu do asoc.pole
    $ArrStyle = array();
    foreach (explode(";", $Text) as $Style) {
        preg_match('~(.+):(.+)~i', $Style , $Arr)    ;
        if(!trim($Arr[1]) || !trim($Arr[2])) continue    ;
         $ArrStyle[trim($Arr[1])] = trim($Arr[2])    ;
     }
    return $ArrStyle        ;
}

static public function Clear($Text){ // vyčištění stylu , přepisuje duplikátní nastavení pozdější hodnotou
    $echo = array();
    foreach (self::ToArr($Text) as $Attr=>$Val) {
         $echo[] = $Attr.":".$Val    ;    
     }    
    return implode(";", $echo);
}

static public function File2Arr($File){
        $Css = file_get_contents($File)    ;
        $Css = preg_replace("~[\r\n]~i","",$Css);
        $Css = bezmezer($Css);
        $Css = preg_replace("~}~i","}\n",$Css);
        $Css = trim($Css);
        preg_match_all("~(.*){(.*)}~i", $Css, $Arr)    ;        
        $CssArr = array();  // pole stylů z CSS souboru
        foreach ($Arr[1] as $key=>$value) {
            $Attrs = trim($Arr[1][$key])    ;
            foreach (explode(",", $Attrs) as $Attr) {    
                $CssArr[trim($Attr)] = trim($Arr[2][$key])    ;    
             }
        }
        return $CssArr ;
    }

static public function Add2SimpleHtmlDom($SimpleHtmlDom,$CssFile){ 
        foreach (self::File2Arr($CssFile)  as $InLKey=>$InLVal) { 
            $Ret = $SimpleHtmlDom->find($InLKey) ;
            foreach ($Ret as &$Element) {    
                $Element->setAttribute("style", self::Clear($Element->getAttribute("style").";".$InLVal).";" ) ; 
            }
        }
        return $SimpleHtmlDom ;
    }    
} 

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: