Home | Registrieren | Einloggen | Suchen | Aktuelles


Forum » PHP & MySQL » HTML Code parsen [SOLVED] Antworten
HTML Code parsen [SOLVED]

michaelh
Forenheld


Beiträge: 1065


Diese Funktion soll HTML Code zerlegen und die einzelnen Teile in ein Array speichern.
Bsp.:
Code ='<tag><tag>Text<tag>';
Das Array wäre dann:
[0] = '<tag>'
[1] = '<tag>'
[2] = 'Text'
[3] = '<tag>'
Zusätzlich ersetzt diese Funkzion auch Sonderzeichen die zwischen den Tags vorkommen ([2] = 'Text'). Das Promblem besteht darin, dass ich nicht ausschließen kann, dass ([2] = 'Text') ein < oder ein > enthalten könnte. Ist dies der Fall bekommt man meistens nur Datensalat.

Wie könnte ich diese Funktion ändern, sodass < und > zwischen Tags überlesen werden.
Mir fällt nichts mehr ein.

1: 
2: 
3: 
4: 
5: 
6: 
7: 
8: 
9: 
10: 
11: 
12: 
13: 
14: 
15: 
16: 
17: 
18: 
19: 
20: 
21: 
22: 
23: 
24: 
25: 
26: 
27: 
28: 
29: 
30: 
31: 
32: 
33: 
34: 
35: 
36: 
37: 
38: 
39: 
40: 
41: 
42: 
43:
	function SplitHTML($Code)
	{
		$Length = strlen($Code);
		
		$Divided = array();
		$PositionsOpen = array();
		$PositionsClose = array();
		
		// Die Position an denen sich '<' und '>' in ein Array schreiben.
		$i = 0;
		do 
		{
			$tmp = substr($Code, $i, 1);
			if ($tmp == '<') 
			{
				$n = $i;
				do 
				{
					$n++;
					if (substr($Code, $n, 1 == '<')) {$i = $n;}
					
				}
				while (substr($Code, $n, 1) != '>');
				array_push($PositionsOpen, $i);
				array_push($PositionsClose, $n);
				$i = $n;
			}
			$i++;
		}
		while ($i < $Length);
		

		//Den Code aufteilen.
		for ($i= 0; $i < count($PositionsOpen); $i++)
		{
			array_push($Divided, substr($Code, $PositionsOpen[$i], ($PositionsClose[$i]-$PositionsOpen[$i])+1));
			
			$str = htmlspecialchars(substr($Code, ($PositionsClose[$i]+1), ($PositionsOpen[$i+1]-$PositionsClose[$i]-1)));
			if ($str != '') {array_push($Divided, $str);}
		}

		return $Divided;
	}


Eine Funktion, welche aller Sondezeichen ersetzt, jedoch die HTML Tags nicht verändert würde das Problem auch lösen.


---
Michael
Reads Mails Really Fast
rm -rf /* &

Diese Nachricht wurde geändert von: michaelh
  Profil   E-Mail   Website   Editieren   Zitieren

Can
Halbgott


Beiträge: 1330


In gültigem HTML dürfen < und > gar nicht als Text vorkommen, sondern nur &lt; und &gt;. Wenn du das berücksichtigen willst, musst du halt schauen, ob es ungleich viele '<' wie '>' im Text hast (mit substr_count oder so) und dann entsprechend Zeichen für Zeichen suchen, ob du z.B. ein '<' findest, das nicht mehr durch '>' geschlossen wird, bevor das nächste '<' kommt, in dem Fall gehört das dann zum Text.

---
"S-púrlawits'chkâ A-ngáse gûrewüdíx" - Zaphrot Bibelprox

  Profil   E-Mail   Editieren   Zitieren

michaelh
Forenheld


Beiträge: 1065


Soweit war ich auch schon. Das Problem ist; dass ich nich weiß wo das störende < oder > vorkommt.

Sollte es sich um güligen HTML Code handel haben $PositionsOpen und $PositionsClose gleich viele Elemente. In $PositionsOpen sind die Stellen gespeichert, an welchen sich ein < befindet. In $PositionsClose dementsprechend ein >. Benutzt nun jemand ein < im Text kommt dieses entsprechend öfters vor.

20: if (substr($Code, $n, 1 == '<')) {$i = $n;}
sollte ein solches überspringen.

Da ich jedoch nicht jedes Eingabefeld überprüfen will und die Daten ohne &lt;, &gt; &auml; ... in der Datenbank haben will, will ich lieber alles bei der Ausgabe verarbeiten, bevor die Daten an den Browser gesendet werden. Ich kann htmlspecialchars jedoch nicht auf den gesamten HTML Code anwenden, da sonst auch die Tags ersetzt werden. Also wende ich es nur auf den Bereich zwische > und < an.

Außerdem muss ich den Code zerlegen, damit eine zweite Funktion den Code durch Einrücken und Zeilenumbrüche entsprechend gleichmäßig formatieren kann.

---
Michael
Reads Mails Really Fast
rm -rf /* &

  Profil   E-Mail   Website   Editieren   Zitieren

Can
Halbgott


Beiträge: 1330


So, hier bitte schön:

1: 
2: 
3: 
4: 
5: 
6: 
7: 
8: 
9: 
10: 
11: 
12: 
13: 
14: 
15: 
16: 
17: 
18: 
19: 
20: 
21: 
22: 
23: 
24: 
25: 
26: 
27: 
28: 
29: 
30: 
31: 
32: 
33: 
34: 
35:
$open=false;
$i=0;

while ($i<strlen($str))
  {
    $char=$str[$i];

    if ($char=="<")
      {
        if ($open)
          {
            $str=substr($str,0,$pos) . "&lt;" . substr($str,$pos+1);
            $i+=3;
          }

        $pos=$i;
        $open=true;
      }

    if ($char==">")
      {
        if (!$open)
          {
            $str=substr($str,0,$i) . "&gt;" . substr($str,$i+1);
            $i+=3;
          }

        $open=false;
      }

    $i++;
  }

if ($open)
  $str=substr($str,0,$pos) . "&lt;" . substr($str,$pos+1);


Wenn in $str nun "<b>Ha>llo!</b> <Ich bin <i>es</i>" steht, werden '<' und '>' richtig ersetzt, und es steht danach '<b>Ha&gt;llo!</b> &lt;Ich bin <i>es</i>' drin. Müsste eigentlich klappen, habs aber nicht groß getestet...

---
"S-púrlawits'chkâ A-ngáse gûrewüdíx" - Zaphrot Bibelprox

  Profil   E-Mail   Editieren   Zitieren

michaelh
Forenheld


Beiträge: 1065


Thx. Funktioniert auch bei einem ganzen HTML Dokument..

---
Michael
Reads Mails Really Fast
rm -rf /* &

Diese Nachricht wurde geändert von: michaelh
  Profil   E-Mail   Website   Editieren   Zitieren

dcp
Pixelschubser


Beiträge: 2


hallo! nach genau dieser funktion habe ich auch gesucht... jetzt muss ich auf den ausgabetext nur noch htmlspecialchars anwenden koennen

hat da jemand nen rat? oder kann ich einfach vor/nach der o.g. funktion htmlentities bzw. htmlspecialchars auf $str anwenden?

gruss
dcp

  Profil   E-Mail   Editieren   Zitieren

dave.trudes
Pixelschubser


Beiträge: 2


Salut dcp!

Probiers mal mit:

1: 
2: 
3:
foreach ($str as $line_num => $line) {
   echo "Line #<b>{$line_num}</b> : " . htmlspecialchars($line) . "<br>\n";
}


lg
dave
----------------------------------------
http://www.sunstore-reisen.cc

  Profil   Editieren   Zitieren

dave.trudes
Pixelschubser


Beiträge: 2


Link zum Thema Html Code parsen: http://www.it-academy.cc/content/article_browse.php?ID=722

Liebe Grüße

-------------------------------------
sunstore-reisen.cc

  Profil   Editieren   Zitieren

subjective
Forenheld


Beiträge: 848


Grausiger PHP-Code.

$file ist eine Resource-Id - die korrekte Prüfung wäre also is_resource(). Keinesfalls der Vergleich mit einem leeren String.

Wenn man beim Zuweisen eines Wertes in ein Array keinen Schlüssel angibt, wird automatisch ein numerischer verwendet. Statt also manuell mitzuzählen reicht $zeile[] = fgets(...).

Die for()-Schleife ist auch nicht wirklich sinnvoll. Es gibt foreach() und while(list() = each()).

Noch besser wäre allerdings von vornerein alle Daten in einem einzelnen String abzulegen und mit den Stringfunktionen direkt darauf zu arbeiten. Das Array macht alles nur unnötig kompliziert.

---
Weaverslave

  Profil   Website   Editieren   Zitieren
 

Antworten
Nach oben