---
title: "Validera HTML från formulär"
type: "forum-thread"
url: "https://www.webforum.nu/amne/php/176232-validera-html-från-formulär"
topic: "PHP"
topic_url: "https://www.webforum.nu/amne/php"
author: "Mog"
published: "2009-01-07T21:50:45.000Z"
updated: "2009-01-11T10:07:14.000Z"
replies: 4
views: 403
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/php/176232-validera-html-från-formulär"
---

# Validera HTML från formulär

## #1 — Mog, 2009-01-07T21:50Z

Ä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

```php
[B][U]Fel ordning[/B][/U]
```

så klagar ju [validatorn](http://www.htmlhelp.com/tools/validator/)  på detta, lite trist när resten av sidan går igenom.
Skulle alltså vilja kolla detta innan inlägget sparas.

Permalänk: https://www.webforum.nu/p/176232

## #2 — Mog, 2009-01-10T23:11Z

Tror jag har löst det, koden kommer här om nån är intresserad.
Bara testad med "forumtaggar" .

```php
// 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.

Permalänk: https://www.webforum.nu/p/2165105

## #3 — überfuzz, 2009-01-11T01:48Z

> **Mog skrev:**
>
> ```php
> 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..?

Permalänk: https://www.webforum.nu/p/2165112

## #4 — Mog, 2009-01-11T08:32Z

Sorry, tänkte inte på det, kändes självklart för mig   :r 

```php
$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.

Permalänk: https://www.webforum.nu/p/2165113

## #5 — überfuzz, 2009-01-11T10:07Z

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...

Permalänk: https://www.webforum.nu/p/2165120

---

Tråden på webben: https://www.webforum.nu/amne/php/176232-validera-html-från-formulär
