Tror jag har löst det, koden kommer här om nån är intresserad.
Bara testad med "forumtaggar" .
// validateHTML("text som ska kollas", "array med starttaggar", "array med sluttaggar")
// returnerar null om OK annars felmeddelande
function validateHTML($text, $sTags, $eTags)
{
$text = strtolower($text);
$error = null;
// Kolla så det är lika många start som sluttaggar
for ($i=0; $i<count($sTags); $i++) {
$sTagsPos = strposall($text, $sTags[$i]);
$eTagsPos = strposall($text, $eTags[$i]);
if (count($sTagsPos) < count($eTagsPos)) {
$error = $error."Starttagg för ".$eTags[$i]." saknas.<BR>\n";
}
elseif (count($sTagsPos) > count($eTagsPos)) {
$error = $error."Sluttagg för ".$sTags[$i]." saknas.<BR>\n";
}
}
// Är det några fel nu så slutar vi
if ($error) {
return $error;
}
// Loopa alla taggar i sTags
for ($i=0; $i<count($sTags); $i++) {
//echo "Kollar ".$sTags[$i]."<BR>";
$sTagsPos = strposall($text, $sTags[$i]);
$eTagsPos = strposall($text, $eTags[$i]);
for ($y=0; $y<count($sTags); $y++) {
// Onödigt att jämföra med sig själv
if ($y != $i) {
//echo "Jämför med ".$sTags[$y]."<BR>";
$sTagsPos2 = strposall($text, $sTags[$y]);
$eTagsPos2 = strposall($text, $eTags[$y]);
for ($x=0; $x<count($sTagsPos); $x++) {
for ($z=0; $z<count($sTagsPos2); $z++) {
if ($sTagsPos2[$z] < $sTagsPos[$x] && $eTagsPos2[$z] < $eTagsPos[$x] && $eTagsPos2[$z] > $sTagsPos[$x]) {
$error = $error."Starttagg för ".$sTags[$y]." är före starttagg för ".$sTags[$i]." och då ska sluttaggen ".$eTags[$y]." vara efter ".$eTags[$i].".<BR>\n";
}
}
}
//echo "____________________________<BR>";
}
}
//echo "<HR>";
}
return $error;
}
// Returnera array med position på alla $needle i $haystack
// Kopierad från php.net
function strposall($haystack,$needle)
{
$s=0;
$i=0;
while (is_integer($i)){
$i = strpos($haystack,$needle,$s);
if (is_integer($i)) {
$aStrPos[] = $i;
$s = $i+strlen($needle);
}
}
if (isset($aStrPos)) {
return $aStrPos;
}
else {
return null;
}
}
Hittar ni fel eller kommer på bättre lösningar så är meddelande om detta välkommet.
