MogMedlem sedan nov. 2003266 inlägg Är det någon som har några ideér eller nån funktion för HTML-validering från ett formulär?
Jag har ett forum där användare kan använda forumtaggar likadant som på webforum.nu.
Men om nu nån klantar sig och skriver
[B][U]Fel ordning[/B][/U]
så klagar ju validatorn på detta, lite trist när resten av sidan går igenom.
Skulle alltså vilja kolla detta innan inlägget sparas.
MogMedlem sedan nov. 2003266 inlägg 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.
überfuzzMedlem sedan apr. 2006409 inlägg
Mog skrev:
validateHTML(???)
function strposall(???)
Hittar ni fel eller kommer på bättre lösningar så är meddelande om detta välkommet.
Det jag undrade när jag såg ditt senaste inlägg var dokumentation. Har du gjort två tjusiga funktioner utan att vilja beskriva hur de ska användas..?
MogMedlem sedan nov. 2003266 inlägg Sorry, tänkte inte på det, kändes självklart för mig :r
$message = ("
[b]En text med forumtaggar.[/b]
[i]Detta ger ett [u]fel.[/i][/u]
");
// Taggarna som ska kollas
$sTags = array("[i]", "[b]", "[u]");
$eTags = array("[/i]", "[/b]", "[/u]");
$HTMLError = validateHTML($message, $sTags, $eTags);
// Ta bort mellanslaget mellan & och # i str_replace
// WebForum ersatte den med hakparantes och då blev det att man ersatte [ med [ istället för "och"#9x;
if ($HTMLError) {
$content = $HTMLError;
$content = str_replace("[", "& #91;", $content);
$content = str_replace("]", "& #93;", $content);
$content = "Texten klarar inte HTML-valideringen, följande fel hittades.<BR><BR>\n\n".$content;
}
else {
$content = "Grattis, inga fel !";
}
echo $content;
Hoppas detta gör saker lite klarare.
überfuzzMedlem sedan apr. 2006409 inlägg Nä, det är klart. Dokumentation verkar inte vara det första folk tänker på när de postar sina alster. Det är alltjämt så att det är lättare att använda en funktion om man vet vilka argument den tar och vad den spottar ut. Många gånger kan man ju namnge delarna i funktionen så att den som skådar begriper. Skriver man en kort förklaring, två tre rader blir det ännu enklare. php.net har hyfsad dokumentation av funktioner. Man kan ju inspireras av den sidan...