HTML Code parsen [SOLVED] |
michaelh
Forenheld Threadstarter
Beiträge: 1061 |
Diese Funktion soll HTML Code zerlegen und die einzelnen Teile in ein Array speichern.
Bsp.:
Code =' Text';
Das Array wäre dann:
[0] = ''
[1] = ''
[2] = 'Text'
[3] = ''
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
Editieren
Zitieren
|
Can
Halbgott
Beiträge: 1324 |
In gültigem HTML dürfen < und > gar nicht als Text vorkommen, sondern nur < und >. 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 Threadstarter
Beiträge: 1061 |
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 <, > ä ... 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
Editieren
Zitieren
|
Can
Halbgott
Beiträge: 1324 |
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")
{
if (!$open)
{
$str=substr($str,0,$i) . ">" . substr($str,$i+1);
$i+=3;
}
$open=false;
}
$i++;
}
if ($open)
$str=substr($str,0,$pos) . "<" . substr($str,$pos+1); |
Wenn in $str nun " Ha>llo! es" steht, werden '<' und '>' richtig ersetzt, und es steht danach 'Ha>llo! <Ich bin es' 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 Threadstarter
Beiträge: 1061 |
Thx. Funktioniert auch bei einem ganzen HTML Dokument..
---
Michael
Reads Mails Really Fast
rm -rf /* &
Diese Nachricht wurde geändert von: michaelh |
 Profil
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 #{$line_num} : " . htmlspecialchars($line) . " \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: 844 |
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
|