Bestimmte html Elemente und Attribute erlauben, dessen Werte auf Muster matchen

Moin. Ich habe eine kleine Durchsetzungsfrage.

Ich habe jetzt extra dieses Beispielskript geschrieben für das,
was ich brauche. Undzwar sollen Artikel geschrieben werden
nach einer EInstellung erlaubter html elemente und Attribute
und der Attributwerte, die nur auf ein RegExp matchen dürfen.

Code:
<html>
<head>
<title>Beispiel</title>
</head>
<body>

<?php
if (!empty($_GET['message']))
{
	$message = $_GET['message'];

	$allowed = array
	(
		'p'	=> array
		(
			'align'	=>	'/^left|right|center$/i'
		),
		'div'	=> array
		(
			// Keine Attribute für divs zulassen
		),
		'table' => array
		(
			'width'		=>	'/^[d]{1,3}?px$/',
			'border'		=>	'/^[d]{1,3}$/',
			'cellpadding'	=>	'/^[d]{1,3}$/',
			'cellspacing'	=>	'/^[d]{1,3}$/'
		)
	);


	$valid = true;

	// Hier mit Fehlermeldung abbrechen, wenn ein Element oder Attribut benutzt wurde, das nicht in der
	// Liste der verwendungserlaubten Elemente und Attribute steht.
	$valid = $false;


	if (!$valid)
	{
		// Die Fehler ausgeben
	}
}
?>

<form action="index.php">
<textarea name="message"></textarea><br />
<input type="submit" />
</form>

<?php
// messages mit Dateinamen und Inhalt auflisten
chdir('messages');

foreach (glob('*.htm') as $message_path)
	echo "<hr /><b>$message_path</b><hr />" . file_get_contents($message_path);
?>

</body>
</html>

Wie ist das mit xml Parsing durchzusetzen?
Sollte jemand vergesen haben, ein Tag abzuschließen,
oder einen Attributwert eingegeben haben, der nichts
aufs muster passt oder ein Element, das nicht erlaubt ist,
soll mit einer Fehlermeldung abgebrochen werden.

xmlparsing in php bzw. überhaupt kenne ich noch nicht.
Ist das durczusetzten? und welche Funktionen müsste ich kennen
bzw. welches Tutorial passt am Besten auf meine Frage?

// edit
HAHA. Is ja leichter als ich dachte.
Hat sich erledigt. Sorry, dass ich zu schnell drauf losgepostet habe.
 
Nun, prinzipiell könntest du die Aufgabe lösen, indem du den Text in ein leeres Root-Element schiebst und gegen ein passendes Schema (http://de.selfhtml.org/xml/dtd/index.htm) validierst:

Code:
<?xml version="1.0"?>
<!DOCTYPE elementcheck [
<!ELEMENT elementcheck (#PCDATA|p|div|table)*>
<!ELEMENT p (#PCDATA|p|div|table)*>
<!ELEMENT div (#PCDATA|p|div|table)*>
<!ELEMENT table (#PCDATA|p|div|table)*>
<!ELEMENT table (#PCDATA|p|div|table)*>
<!ATTLIST p align (left|right|center) #IMPLIED>
<!ATTLIST table
  width CDATA #IMPLIED
  border CDATA #IMPLIED
  cellpadding CDATA #IMPLIED
  cellspacing CDATA #IMPLIED
>
]>
<elementcheck>
<?php echo $meintext; ?>
</elementcheck>

Du kannst das z.B. mit den XML-Reader Funktionien validieren:
http://de.php.net/manual/de/function.xmlreader-isvalid.php

Alternativ kannst du natürlich auch RelaxNG oder XSD nehmen. XSD dürfte noch genauer sein als DTD, da die Attribute besser spezifiziert werden können.
Allerdings sollte für den ganzen Spaß das XML wohlgeformt sein.

mfg, metax.
 
Zurück
Oben