Antworten auf deine Fragen:
Neues Thema erstellen

htmlentities erlaubte span tag

Hi,

ich möchte gerne alle Umlaute, Sonderzeichen und HTML-Tags mit htmlentities umwandeln, ausgenommen span-tags.
Code:
<?php
        function encode($var){
            
            // ENCODE $var
            
            
        }
        $val = '<span style="color:rgb(255,0,0);"> üäö <title></title> </span>';
        die(encode($val));
?>
Ein einfacher Replace und dann am Ende wieder anhängen würde nicht funktionieren, da die Styles innerhalb des Tags variabel sind.

Wie mache ich das dann?
 

Duddle

Posting-Frequenz: 14µHz

AW: htmlentities erlaubte span tag

Du könntest es normal mit htmlentities() umwandeln und dann per preg_replace() selektiv die <span>s zurückwandeln, aber sauberer wäre es, das HTML als DOMDocument zu parsen, rekursiv über die Knoten zu laufen und dann anhand des Tags zu entscheiden ob du dessen Kindelemente mit htmlentities() umwandeln willst.


Duddle
 
AW: htmlentities erlaubte span tag

Du könntest es normal mit htmlentities() umwandeln und dann per preg_replace() selektiv die <span>s zurückwandeln
Hi und danke für deinen Beitrag,

das könnte ich, aber es sind ja auch alle Attribute innerhalb des <span>-Elements umgewandelt worden und die kann ich nicht mehr einzeln zurückwandeln weil sie ja in allen elementen verwendet werden könnten (siehe style-Attribut in meinem Post).
Ich möchte das nach der Umwandlung natürlich auch meine Attribute erhalten bleiben.
das HTML als DOMDocument zu parsen, rekursiv über die Knoten zu laufen und dann anhand des Tags zu entscheiden ob du dessen Kindelemente mit htmlentities() umwandeln willst.
Kannst du mir ein Beispiel zeigen?
 

netbandit

Aktives Mitglied

AW: htmlentities erlaubte span tag

evtl so:

PHP:
function encode($var){            
    $arr = preg_split('/(\<[\/]?span[^\>]*\>)/ui', $var, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
    $var = '';
    foreach($arr as $v){
        if(!preg_match('/^(\<[\/]?span[^\>]*\>)$/ui', $v)){
            $v=htmlentities($v, ENT_QUOTES, 'UTF-8');
        }
        $var .= $v;
    }
    return $var;
}
?! :uhm:

Grüße :)
 
Zuletzt bearbeitet:
AW: htmlentities erlaubte span tag

Hi und danke für eure Beitrage,
@netbandit, das ist genau das was ich gesucht habe. Danke! Jedoch habe ich meine Anforderungen geändert und suche nun nach etwas Ähnlichem aber nicht genau gleichem.
@duddle, dein Vorschlag ist gut, ich habe mich daran mal gemacht.
Ich möchte eine Funktion schreiben, die alle Tags in einem String mit htmlentities zu HTML-Zeichen umwandelt, sofern die Tags nicht explizit davon freigesprochen wurden:
Code:
    function encode($str){
        
        $DOM = new DOMDocument;
        $DOM->loadHTML($str);
        $items = $DOM->getElementsByTagName('*');
        for ($i = 0; $i < $items->length; $i++){
                switch($items->item($i)->tagName){
                    case "html":
                    case "body":
                    case "b":
                    case "br":
                    case "strong":
                    case "i":
                    case "u":
                    case "blockquote":
                    case "hr":
                    case "ul":
                    case "li":
                    case "ol":
                          // Wenn Element oben genannte Bedingungen trifft
                        // dann schreibe in $content den originalen Tag ohne
                        // htmlentities
                        continue;
                        break;
                    default:
                      // Wenn Element nicht oben genannte Bedingungen trifft
                        // dann schreibe in $content den Tag mit htmlentities
                        echo $items->item($i)->nodeValue;
                        

                }
        }
    }
    encode("<h1>hello word i am h1 and i want to be htmlentities</h1> ksdfpsjdf <span>i too</span> <b>but i not</b>");
Es soll also hier z.B. h1 formatiert werden, span auch aber b nicht, da b explizit davon freigesprochen wurde. Ich habe das Ganze bereits mit DOMDocument angefangen umzusetzen, mir fehlt jetzt nur noch ein Ansatz das Ganze zu formatieren. Kann mir jemand helfen?
Es sollte also statt
Code:
echo $items->item($i)->nodeValue;
den kompletten String mit umformatierten Zeichen ausgeben.

// EDIT: Ich habe eins vergessen zu erwähnen. Ich habe noch nicht geprüft ob die Attribute gleich null sind. Aber das kann ich ggf. später selber hinzufügen. Ich meine damit, dass wenn Attribute vorhanden sind, soll auch eine Umwandlung mit htmlentities vorgenommen werden, nur wenn keine vorhanden sind sprich die Tags ohne jegliche Attribute sind dann sollen sie ignoriert werden.
 
Zuletzt bearbeitet:

netbandit

Aktives Mitglied

AW: htmlentities erlaubte span tag

... ginge mit geringfügigen Anpassungen der o. Funktion auch:

PHP:
function encode($var, $tag=array()){ 
    if(count($tag)>=1){
        $arr = preg_split('/(\<[\/]?' . implode('[^\>]*\>)|(\<[\/]?', $tag) . '[^\>]*\>)/ui', $var, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
        $var = '';
        foreach($arr as $v){
            if(preg_match('/^(\<[\/]?((' . implode(')|(', $tag) . '))[^\>]*\>)$/ui', $v)){
                $var .= $v;
            }
            else{
                $var .= htmlentities($v, ENT_QUOTES, 'UTF-8');
            }            
        }
    }
    else{
        $var=htmlentities($var, ENT_QUOTES, 'UTF-8');
    }
    return $var;
}
$val = '<span style="color:rgb(255,0,0);"> üäö <title></title> </span>';
echo encode($val, array('span', 'title'));
Grüße ;)
 
AW: htmlentities erlaubte span tag

Sorry aber dem ist doch garnicht so. Der title-Tag wird nicht umgewandelt. In meiner Funktion ist er aber nicht als ausgeschlossen definiert, deshalb müsste er umwandelt werden.
Es sollen ja alle Tags umgewandelt werden es sei denn sie sind in der case-Liste.
 

netbandit

Aktives Mitglied

AW: htmlentities erlaubte span tag

Na hier musste schon angeben, welche erhalten werden sollen:

PHP:
echo encode($val, array('span', 'title'));
Im Array natürlich anpassen..., da war ich jetzt natürlich faul und habe Deine Tags nicht übernommen.

Grüße ;)
 

Duddle

Posting-Frequenz: 14µHz

AW: htmlentities erlaubte span tag

Hier mal ein Ansatz, der mgl. Attribute in den Tags ignoriert. Da deine Vorgaben recht speziell sind, muss hier einiges manuell gemacht werden, aber das Prinzip sollte immer noch deutlich erkennbar sein:

PHP:
<?php
function walk($dom, $block) {
    //falls nur Text, dann einfach kodiert zurück
    if($dom->nodeType == XML_TEXT_NODE) {
        return htmlentities($dom->nodeValue);
    }
    //ansonsten Kinder abarbeiten
    $childString = "";
    if($dom->hasChildNodes()) {
        foreach($dom->childNodes as $node) {
            $childString .= walk($node, $block);
        }
    }

    //jetzt ist der Inhalt bekannt, also die Verpackung korrekt verarbeiten
    $tag = $dom->tagName;
    $alpha = "<".$tag.">";
    $omega = "</".$tag.">";

    //falls gewuenscht, kodieren
    if(!in_array($tag, $block)) {
        $alpha = htmlentities($alpha);
        $omega = htmlentities($omega);
    }

    return $alpha.$childString.$omega;

}
function encode($str) {
    //den String als XML lesen. 
    //XML muss aber wohlgeformt sein, also in ein pseudo-Wurzelelement packen
    $dom = new DOMDocument();
    $dom->loadXML("<roooooot>".$str."</roooooot>");

    //erst ab dem ersten Kind lesen, d.h. Wurzelelement ignorieren
    $block = array("b", "h1", "roooooot");
    $ret = walk($dom->firstChild,$block);

    //Wurzelelement rausschmeissen, den Rest zurück
    $ret = preg_replace("/<\/?roooooot>/i", "", $ret);
    return $ret;
}
echo encode("<h1>HHH1</h1> <span><b>SPANI</b> NURSPAN</span> <b>NURB</b>");
?>
Statt XML und dem Pseudo-Wurzelelement könntest du direkt HTML benutzen, aber DOMDocument will das unbedingt in noch mehr Tags packen.
Ansonsten kannst du nach dem Prinzip noch die Attribute einbauen, das sind so weit ich weiß ja auch nur Kindknoten mit anderem Typ.


Duddle
 
AW: htmlentities erlaubte span tag

Na hier musste schon angeben, welche erhalten werden sollen
Sorry, die Zeile habe ich total übersehen :D
Die Funktion ist echt super, ein Problem hab ich damit noch: Die Funktion erlaubt Attribute.
Rufe die Funktion mal folgendermaßen auf:
Code:
$val = '<span style="color:rgb(255,0,0);"> üäö <title>title</title> </span> <b>hello world</b> <strong style="color:red;">strong</strong>';
echo encode($val, array('b', 'strong'));
Das letzte strong-tag wird nicht ersetzt, solte es aber weil nur strong tags erlaubt sein sollten ohne jegliche Attribute.


@duddle, danke ich werde mir das mal näher angucken.
 

netbandit

Aktives Mitglied

AW: htmlentities erlaubte span tag

Achso, dachte die Tags mit StyleAttributen wären auch valide...

Dann einfach die folgende Zeile

PHP:
if(preg_match('/^(\<[\/]?((' . implode(')|(', $tag) . '))[^\>]*\>)$/ui', $v)){
mit

PHP:
if(preg_match('/^(\<[\/]?((' . implode(')|(', $tag) . '))\>)$/ui', $v)){
ersetzen

Edit: Vergiss es, schliessende Tags werden dabei nicht berücksichtigt. Muss ich nochmal überdenken :D
 
Zuletzt bearbeitet:
AW: htmlentities erlaubte span tag

Hi und danke für deine Antwort,
also das ist echt super, vorallem genau das was ich gesucht habe.
Ich sehe nur noch ein kleines Problem. Ich möchte, dass u.A. auch <br> und <hr>-Tags erlaubt sind. Da diese aber ja selbstschließende Tags nicht werden sie bei deinem preg_match nicht gefunden. Deshalb muss zusätzlich geprüft werden ob vorhanden. Bei den <br>-Tags funktioniert das auch, bei <hr> jedoch nicht:
Code:
<?php


function encode( $var, $tag = array('b', 'strong', 'i', 'u', 'blockquote', 'ul', 'ol', 'li') ){ 
    if(count($tag)>=1){
        $arr = preg_split('/(\<[\/]?' . implode('[^\>]*\>)|(\<[\/]?', $tag) . '[^\>]*\>)/ui', $var, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
        $var = '';
        foreach($arr as $v){
            // Wenn Attribute erlaubt sein sollen folgendes ändern:
            //if(preg_match('/^(\<[\/]?((' . implode(')|(', $tag) . '))[^\>]*\>)$/ui', $v)){
            if(preg_match('/^(\<[\/]?((' . implode(')|(', $tag) . '))\>)$/ui', $v) || $v == "<br>" || $v == "<br />" || $v == "<hr>"){
                $var .= $v;
            }
            else{
                $var .= htmlentities($v, ENT_QUOTES, 'UTF-8');
            }            
        }
    }
    else{
        $var=htmlentities($var, ENT_QUOTES, 'UTF-8');
    }
    return $var;
}
$val = 'erster absatz<br>zweiter absatz <hr> dritter absatz';
echo encode($val);

?>
 
AW: htmlentities erlaubte span tag

Weißt du wie ich es meine? <hr> und <br> sind ja selbstschließend und sollten auch erlaubt sein. Die Lösungen die ich auf die Reihe gebracht habe, haben nicht mit deinem zusammengespielt.. :(
 

netbandit

Aktives Mitglied

AW: htmlentities erlaubte span tag

Das wird nicht das Problem sein, das Problem sehe ich eher bei Tags die nur paarweise funktionieren und Tags die weitere Attribute benötigen (img, a, usw.):

HTML:
<span style="color: #ff0000;">Text</span>
Das Öffnende wird umgewandelt, das Schliessende bleibt valide :hmpf:

Lösbar ist es sicherlich - Ich glaube aber hier sind wir dann doch da gelandet wo Aufwand und Nutzen in keinem Verhältnis mehr stehen..., mein Lösungsansatz nicht mehr zu gebrauchen ist.

Grüße & sorry ;)
 
Zuletzt bearbeitet:
Bilder bitte hier hochladen und danach über das Bild-Icon (Direktlink vorher kopieren) platzieren.
Antworten auf deine Fragen:
Neues Thema erstellen

Willkommen auf PSD-Tutorials.de

In unseren Foren vernetzt du dich mit anderen Personen, um dich rund um die Themen Fotografie, Grafik, Gestaltung, Bildbearbeitung und 3D auszutauschen. Außerdem schalten wir für dich regelmäßig kostenlose Inhalte frei. Liebe Grüße senden dir die PSD-Gründer Stefan und Matthias Petri aus Waren an der Müritz. Hier erfährst du mehr über uns.

Stefan und Matthias Petri von PSD-Tutorials.de

Nächster neuer Gratisinhalt

03
Stunden
:
:
25
Minuten
:
:
19
Sekunden

Neueste Themen & Antworten

Flatrate für Tutorials, Assets, Vorlagen

Zurzeit aktive Besucher

Statistik des Forums

Themen
118.640
Beiträge
1.538.505
Mitglieder
67.559
Neuestes Mitglied
mic4mac
Oben