XHTML mit PHP validieren
heinetz
- php
Hallo Forum,
ich habe einen Ausschnitt von HTML-Code als Array vorliegen und möchte ihn überprüfen.
Die 5 Beispiele:
... sollen in 5 Quqlitäten unterschieden werden.
ist gültig, weil alle Tags die am Anfang geöffnet auch am Ende wieder geschlossen werden.
beginnt mit schliessenden Tags ohne Inhalt und ist daher ungültig
beginnt mit schliessenden Tags mit Inhalt und ist daher ungültig
endet mit öffnenden Tags ohne Inhalt.
endet mit öffnenden Tags mit Inhalt.
Bekommt man das wohl ausschiesslich mit regulären Ausdrücken hin?
danke für Tipps und
beste gruesse,
heinetz
Hi,
Bekommt man das wohl ausschiesslich mit regulären Ausdrücken hin?
Nein.
(Nicht mit vertretbarem Aufwand.)
MfG ChrisB
Hi,
gut, dann brauche ich einen anderen Ansatz. Zum Spass habe ich mal versucht,
den String mit DOMDocument zu behandeln und bin auf etwas möglicherweise Brauchbares gestossen:
$doc = new DOMDocument();
$doc->loadHTML($string);
Schliessende Tags zu denen das jeweils öffnende fehlt, provozieren eine Warning ... Ein fehlendes schliessendes Tag macht (dummerweise) nichts aus.
Ich hab keine Idee ...
Bevor ich nun irgendwelche wilden Funktionen programmiere, die am Ende doch wieder nicht jeden Fall erfassen, würde ich hier gerne nochmal um Rat fragen. Meine Aufgabenstellung:
Ich verwende einen DIFF-Algorithmus, mit dem sich die Unterschiede in zwei Texten kenntlich machen lassen. Das sieht in etwa so aus:
$old_str = "Hier steht der folgende Text";
$old_array = explode(" ", $old_str);
$new_str = "Hier steht jetzt ein anderer Text";
$new_array = explode(" ", $new_str);
$diff_array = diff($old_array, $new_array);
print_r($diff_array);
//Ausgabe
[array] => Array
(
[0] => Hier
[1] => steht
[2] => Array
(
[d] => Array
(
[0] => der
[1] => folgende
)
[i] => Array
(
[0] => jetzt
[1] => ein
[2] => anderer
)
)
[3] => Text
)
$diff_html = diff2html($diff_array);
echo $diff_str;
//Ausgabe
Hier steht <del>der folgende</del><ins>jetzt ein anderer</ins> Text
Nun enthalten meine Strings aber keinen reinen Text sondern HTML, das verglichen werden soll. Auch das funktioniert gundsätzlich.
$old_html = "<strong>Hier steht der folgende Text</strong>";
//$old_array = explode(" ", $old_str);
$old_array = html2array($old_html);//Zerteilt in Wörter und Tags
$new_html = "<strong>Hier steht jetzt ein anderer Text<strong>";
//$new_array = explode(" ", $new_str);
$new_array = html2array($new_html);//Zerteilt in Wörter und Tags
$diff_array = diff($old_array, $new_array);
print_r($diff_array);
//Ausgabe
[array] => Array
(
[0] = <strong>
[1] => Hier
[2] => steht
[3] => Array
(
[d] => Array
(
[0] => der
[1] => folgende
)
[i] => Array
(
[0] => jetzt
[1] => ein
[2] => anderer
)
)
[4] => Text
[5] => </strong>
)
$diff_html = diff2html($diff_array);
echo $diff_str;
//Ausgabe
<strong>Hier steht <del>der folgende</del><ins>jetzt ein anderer</ins> Text</strong>
... ergibt aber dummerweise nicht immer valides XHML. So z.B. in folgendem Fall:
$old_html = "<strong>Hier steht der folgende Text</strong>";
$old_array = html2array($old_html);
$new_html = '<strong>Hier steht <a href="#">der</a> folgende Text</strong>';
$new_array = html2array($new_html);
$diff_array = diff($old_array, $new_array);
print_r($diff_array);
//Ausgabe
[array] => Array
(
[1] => <strong>
[2] => Hier
[3] => steht
[4] => Array
(
[d] => Array
(
)
[i] => Array
(
[0] =>
[1] => <a href="#">
)
)
[5] => der
[6] => Array
(
[d] => Array
(
)
[i] => Array
(
[0] => </a>
[1] =>
)
)
[7] => folgende
[8] => Text
[9] => </strong>
)
$diff_html = diff2html($diff_array);
echo $diff_str;
//Ausgabe
<strong>Hier steht <ins><a href="#"></ins> der <ins></a></ins> folgende Text</strong>
Ich möchte nun versuchen, dass $diff_array zu korrigieren und also die Subarrays 'd' und 'i' erweitern oder reduzieren.
Dazu dient die Überprüfung ...
hat irgendwer einen Tipp für mich, wie ich das HTML sonst am besten validieren kann? Ich will nur wissen, ob und welche Tags innerhalb eines String geöffnet und danach nicht geschlossen oder geschlossen und nicht zuvor geöffnet wurden.
beste gruesse,
heinetz
Hi!
$doc = new DOMDocument();
$doc->loadHTML($string);
> Schliessende Tags zu denen das jeweils öffnende fehlt, provozieren eine Warning ... Ein fehlendes schliessendes Tag macht (dummerweise) nichts aus.
Ja, das ist in einigen HTML-Dialekten gestattet. Als XML geparst darf das nicht mehr durchgehen.
Lo!