HTML Arıtma: dönüştürme

2 Cevap php

Premise

Ben, örneğin, HTML Purifier <body> elemanı inline stil korumak için, <div> etiketleri <body> etiketleri dönüştürmek için kullanmak istiyorum <body style="background:color#000000;">Hi there.</body> <div style="background:color#000000;">Hi there.</div> açacak. Ben bir custom tag bir kombinasyonu ve bir TagTransform sınıfına bakıyorum.

Current setup

Benim yapılandırma bölümünde, şu anda bu yapıyorum:

$htmlDef  = $this->configuration->getHTMLDefinition(true);
// defining the element to avoid triggering 'Element 'body' is not supported'
$bodyElem = $htmlDef->addElement('body', 'Block', 'Flow', 'Core');
$bodyElem->excludes = array('body' => true);
// add the transformation rule
$htmlDef->info_tag_transform['body'] = new HTMLPurifier_TagTransform_Simple('div');

... Yanı izin <body> ve style (ve class, ve id) yapılandırma direktifleri aracılığıyla niteliği (onlar ' HTML.AllowedElements ve ayrıştırılır olan bir çalışma, büyük bir liste kapsamında re HTML.AllowedAttributes).

Ben tanımı önbelleğe kapalı ettik.

$config->set('Cache.DefinitionImpl', null);

Ne yazık ki, bu kurulum, bu HTMLPurifier_TagTransform_Simple denilen transform() yöntemi asla gibi görünüyor.

HTML.Parent?

Ben oldukça doğal, <div> bir çocuk <body> elemanı izin vermez, beri 'div' ayarlanmış olan, suçlu benim HTML.Parent olduğunu tahmin . Ancak, HTML.Parent ayarını 'html' beni ağlar:

ErrorException: ebeveyn olarak tanınmayan bir öğe kullanamazsınız

Ekleme ...

$htmlElem = $htmlDef->addElement('html', 'Block', 'Flow', 'Core');
$htmlElem->excludes = array('html' => true);

... Bu hata mesajı kurtulur ama yine etiketi dönüşümü değil - bunun yerine kaldırılır.

Ekleme ...

$htmlElem = $htmlDef->addElement('html', 'Block', 'Custom: head?, body', 'Core');
$htmlElem->excludes = array('html' => true);

Bana bir hata mesajı aciklamalar çünkü ... Ayrıca, hiçbir şey yok:

ErrorException: Trying to get property of non-object       

[...]/library/HTMLPurifier/Strategy/FixNesting.php:237
[...]/library/HTMLPurifier/Strategy/Composite.php:18
[...]/library/HTMLPurifier.php:181
[...]

Ben hala sağlamak için gereken kesin sözdizimi anlamaya çalışıyorum, artık son seçenek etrafında titriyor, ama birisi kendi geçmiş deneyimlerine dayanarak bana yardımcı bilir, ben doğru yönde herhangi bir işaretçiler takdir ediyorum.

HTML.TidyLevel?

Yalnızca diğer suçlu olarak ben, benim HTML.TidyLevel 'heavy' ayarlandığında olmak hayal edebilirsiniz. Ben bu konuda tüm olası takımyıldızları denemek için henüz ettik, ancak bugüne kadar, bu hiçbir fark yapıyor.

(Ben sadece ikincil bu dokunmadan oldum beri, ben onları burada listelemek istiyorum diye, ben zaten denedim hangi takımyıldızları hatırlamak için mücadele, ama olduğu gibi ben yaptım bir şey kaçırmak ya da bir şey misreport olmaz güven eksikliği Ben bazı özel test yaptık ne zaman. Gerçi daha sonra bu bölümü düzenlemek olabilir!)

Full Configuration

Benim yapılandırma verileri JSON saklanır ve daha sonra HTML Arıtma ayrıştırılır. İşte dosya:

{
    "CSS" : {
        "MaxImgLength" : "800px"
    },
    "Core" : {
        "CollectErrors" : true,
        "HiddenElements" : {
            "script"   : true,
            "style"    : true,
            "iframe"   : true,
            "noframes" : true
        },
        "RemoveInvalidImg" : false
    },
    "Filter" : {
        "ExtractStyleBlocks" : true
    },
    "HTML" : {
        "MaxImgLength" : 800,
        "TidyLevel"    : "heavy",
        "Doctype"      : "XHTML 1.0 Transitional",
        "Parent"       : "html"
    },
    "Output" : {
        "TidyFormat"   : true
    },
    "Test" : {
        "ForceNoIconv" : true
    },
    "URI" : {
        "AllowedSchemes" : {
            "http"     : true,
            "https"    : true,
            "mailto"   : true,
            "ftp"      : true
        },
        "DisableExternalResources" : true
    }
}

(URI.Base, URI.Munge ve Cache.SerializerPath de ayarlanır, ama bu macun onları kaldırdık Ayrıca, HTML.Parent ihtar:. As söz konusu, genellikle bu 'div' ayarlanır.)

2 Cevap

Bu kod ne yaptığınızı neden çalışmıyor nedeni:

/**
 * Takes a string of HTML (fragment or document) and returns the content
 * @todo Consider making protected
 */
public function extractBody($html) {
    $matches = array();
    $result = preg_match('!<body[^>]*>(.*)</body>!is', $html, $matches);
    if ($result) {
        return $matches[1];
    } else {
        return $html;
    }
}

Sen yanlış olarak% Core.ConvertDocumentToFragment kullanarak kapatabilirsiniz; kodunuzu kalanı bugfree ise, oradan düz çalışması gerekir. Ben senin bodyElem tanımı necessary.j inanmıyorum

Bunu yapmak çok daha kolay olmaz mıydı:

$search = array('<body', 'body>');
$replace = array('<div', 'div>');

$html = '<body style="background:color#000000;">Hi there.</body>';

echo str_replace($search, $replace, $html);

>> '<div style="background:color#000000;">Hi there.</div>';