HTML Code richtig kürzen

01/28/2015 22:39 Mr.Tr33#31
Quote:
Originally Posted by NotEnoughForYou View Post
1.Du pushst jeden tag der geöffnet wird auf den Stack.
2. Sobald du auf ein end Tag triffst holst du mit pop das letzte Tag-Element (dieser Art) das auf dem Stack liegt (last in - first out).
3. Wenn du dann durch bist mit deinem Durchgang und noch was auf dem Stack liegt zb. ein <a> weisst du, dass dieses a nicht geschlossen wurde.
4. Welches a es ist kannst du dann einfach abzählen wenn es zb. sonst kein a mehr im stack gibt ist es das 1. a in deinem Code, etc.

Funktioniert natürlich nur, wenn deine Schachtelung korrekt ist.
Ich habe das da oben mal in Punkte unterteilt.
Zum Punkt 2 ... mit array_pop bekomme ich nur das letzte raus und kein bestimmtes einer Art
Zum Punkt 4 ... wieso das erste a? kann doch genauso gut das letzte a sein. Und wie kann ich es denn einfach abzählen?

Edit:
Ich habe ein Problem mit meinem RegExp ...
Habe folgenden Code:
Code:
<(.*?)( .*?>|>)
Damit bekomme ich jeden HTML Tag, selbst <br /> und <img ... />. Das möchte ich aber nicht.
Ich weiß, dass ich eig. mit ^/ alles ausser den / suche, aber so funktioniert es leider nicht:
Code:
<(.*?)( .*?^/>|>)
Jemand eine Idee?
01/28/2015 23:11 NotEnoughForYou#32
Code:
<?php
class StackImplementation {
    private $array = array();
    
    
    public function __construct() {
    }
    
    
    public function push($elm) {
        $this->array[] = $elm;
    } 
    
   public function pop($elm) {        
        for($i=count($this->array)+1; $i>=0; $i--) {                
            if($this->array[$i] == str_replace("/", "", $elm)) {
                unset($this->array[$i]);            
                return;
            }
        }      
      
    }
    
    public function printArray() {
        print_r($this->array);
    }
    
    
}


$stack = new StackImplementation();
$text = "<pr>Das ist ein <pr>Absatz<p> </p><a href='#'>Link</a>";

preg_match_all("/\<.[^ >]*/", $text, $result);



for($i=0; $i<count($result[0]); $i++) {
    if(preg_match("/^\<[^\/].?[^ >]*$/", $result[0][$i])) {      
        $stack->push($result[0][$i].">");
    }
    else {
        $stack->pop($result[0][$i].">");
    }
}

$stack->printArray();



?>
ist nicht die eleganteste Version und nicht wirklich power tested, ist kurz runtergeschrieben, kann man natürlich noch erweitern / den Regex etwas verschönern (wie gesagt nicht wirklich groß getestet und runtergeschrieben), aber als Orientierung taugt es alle mal.

Im Array verbleiben dann nur die Tags die nicht geschlossen wurden.

Bsp: [Only registered and activated users can see links. Click Here To Register...] (am besten Source ankucken wegen den Tags sonst sieht man es nicht richtig)

Wenn du jetzt die nicht geschlossenen Tags hast, kannst du von deren Position im Array auf die Position im Code schließen und entsprechende Schlusstags einfügen.
01/28/2015 23:38 Mr.Tr33#33
Danke für dein Bemühen, jedoch habe ich glaube ich mit dem selben Zeitaufwand wie du ein etwas saubereren Code "hingeschissen" (:D) der sein Ziel bis zum Ende durchzieht :D

Code:
if (preg_match_all ('~<(.*?)(>| (.*?)>)~s', $text, $match)){
	$aStack = array();
	for ($i = 0; $i < count($match[0]); $i++){
		if (substr($match[1][$i], 0, 1) != "/"){
			$aStack[$match[1][$i]]++;
			if (substr($match[3][$i], -1, 1) == "/") $aStack[$match[1][$i]]--;
		}else{
			$aStack[str_replace("/", "", $match[1][$i])]--;
		}
	}
	
	foreach ($aStack as $tag => $count){
		if ($count > 0){
			preg_match('~(.*?)<'.$tag.'~s', $text, $match);
			$text = $match[1];
			break;
		}
	}
}
Ich denke Zeile 2 und 6 könnte man eig. weglassen bzw. Zeile 6 in Zeile 4 mit einbauen :D
Aber fürs Erste funktioniert es :)
Danke für eure Denkanstösse :P
01/29/2015 02:39 .StarSplash#34
Sicherlich ist das mit dem Array keine schlechte oder gar falsche Lösung, aber wieso arbeitest du nicht mit einem "richtigen" Stack? -> [Only registered and activated users can see links. Click Here To Register...]

Das würde deinen Code imo wesentlich übersichtlicher machen. Zudem wäre es sicherlich eine gute Übung für dich, um dich mit dem Datentyp etwas vertraut zu machen.

Was mir gerade noch einfällt: Wenn dir die Tags eigentlich unwichtig sind, gäbe es noch diese Funktion: [Only registered and activated users can see links. Click Here To Register...]
01/29/2015 10:35 Devsome#35
tl;dr:

Wieso machst du auch

Code:
style="list-style-type: disc"
oder
Code:
style="color: #009900"
Dies könnte man schon mit einer CSS Datei lösen.
HTML:
Code:
<span class="1;">
CSS:
Code:
.1{
color: #009900;
}
01/29/2015 10:46 Mr.Tr33#36
Quote:
Originally Posted by .StarSplash View Post
Sicherlich ist das mit dem Array keine schlechte oder gar falsche Lösung, aber wieso arbeitest du nicht mit einem "richtigen" Stack? -> [Only registered and activated users can see links. Click Here To Register...]

Das würde deinen Code imo wesentlich übersichtlicher machen. Zudem wäre es sicherlich eine gute Übung für dich, um dich mit dem Datentyp etwas vertraut zu machen.

Was mir gerade noch einfällt: Wenn dir die Tags eigentlich unwichtig sind, gäbe es noch diese Funktion: [Only registered and activated users can see links. Click Here To Register...]
Wieso ich das nicht benutzt habe? Ganz einfach :D
Mir wurde es falsch ans Herz gelegt und mit Arrays verglichen. Woher soll ich dann wissen, dass es SplStack gibt? :D Und unübersichtlich finde ich diese 10 Zeilen jetzt nicht wirklich, vll fehlen da 1-2 Kommentare aber geht voll.
Dazu ist es nie etwas wirklich falsch, wenn es am Ende schnell, simpel und richtig funktioniert. Ich denke sogar, dass meine Method theoretisch schneller funktioniert, als wenn ich die ganze Classe benutzen würde :P

An strip_tags habe ich auch schon mal gedacht, ich möchte jedoch schon meine langen Texte in HTML angezeigt bekommen, auch wenn diese gekürzt sind :)

@Devsome
Weil ich einen Text mit BBCodes habe und ihn in HTML umwandle.
Als ob ich das sonst auch machen würde :D Dafür würde ich mich voll hassen :D