Regex in XHTML

andy72

Erfahrenes Mitglied
Hallo Leutz,

ich bin seit Tagen damit beschäftigt, ankommende Daten aus TinyMCE zu filtern,
um diese dann in einer DB zu speichern.

Der Filter soll folgendes tun:
Ich möchte HTML-Tags wie "<strong>,<br> und <em>" erlauben, was im PHP ja gut
mit strip_tags(inhalt,erlaubte_tags) funktioniert.

Nun möchte ich aber unterbinden, dass mehr als 2 selbe Tags nacheinander folgen.
Was kann Regex da für mich tun ?
eine Lösung, die mir mehr als einen rausnimmt,hab ich bereits:
Code:
$content = preg_replace("((\<br\ />)+)", "<br>", $content);
aber weiter komme ich nicht :(

LG
Andy
 
Bitte nicht fragen wie und warum, aber nach einer Stunde rumexperimentieren klappt es ;) Nachteil meiner Variante (kann man natürlich noch erweitern, vielleicht, wenn ich morgen Zeit habe...): wenn der Starttag Attribute enthält, wird er nicht richtig erkannt.
PHP:
<?php
$string = '<b>Blubb <b>Blingbling</b> <i>Bla!<strong><i>BLA!</strong></i></i></b><b>Cool!</b>';

function replaceDouble($str)
{
	$openTags = array();
	$tagCurrent = '';
	
	for($i = 0, $j = strlen($str); $i < $j; $i++)
	{
		if(substr($str, $i, 2) == '</')
		{
			$tagClose = substr($str, $i + 2, (strpos($str, '>', $i) - $i - 2));
			if(in_array($tagClose, $openTags))
			{
				unset($openTags[array_search($tagClose, $openTags)]);
			}
		}
		elseif($str[$i] == '<')
		{
			$tagCurrent = substr($str, $i + 1, (strpos($str, '>', $i) - $i - 1));
			if(in_array($tagCurrent, $openTags))
			{
				$tagClosePos = strpos($str, '>', $i) - $i + 1; // start-tag endposition

				$str = substr_replace($str, '', $i, $tagClosePos);
				$tagEnd = '</' . $tagCurrent . '>';
				$tagEndStartPos = strpos($str, $tagEnd, $i);
				$str = substr_replace($str, '', $tagEndStartPos, strlen($tagEnd));
				$j = strlen($str);
			}
			else
			{
				$openTags[] = $tagCurrent;
			}
		}
	}
	
	return $str;
}

echo replaceDouble($string);
?>

Nachtrag
So gehts auch mit Attributen:
PHP:
<?php
$string = '<b style="">Blubb <b>Blingbling</b> <i>Bla!<strong><i>BLA!</strong></i></i></b><b><i>Cool!</i></b>';

function replaceDouble($str)
{
	$openTags = array();
	$tagCurrent = '';
	
	for($i = 0, $j = strlen($str); $i < $j; $i++)
	{
		if(substr($str, $i, 2) == '</')
		{
			$tagClose = substr($str, $i + 2, (strpos($str, '>', $i) - $i - 2));
			if(in_array($tagClose, $openTags))
			{
				unset($openTags[array_search($tagClose, $openTags)]);
			}
		}
		elseif($str[$i] == '<')
		{
			$tagClosePos = strpos($str, ' ', $i); // start-tag endposition
			if((strpos($str, '>', $i)) < $tagClosePos || empty($tagClosePos))
			{
				$tagClosePos = strpos($str, '>', $i) - $i - 1;
			}
			else
			{
				$tagClosePos -= $i + 1;
			}
			$tagCurrent = substr($str, $i + 1, $tagClosePos); #substr($str, $i + 1, (strpos($str, '>', $i) - $i - 1));
			if(in_array($tagCurrent, $openTags))
			{
				$tagClosePos = strpos($str, ' ', $i); // start-tag endposition 
				if((strpos($str, '>', $i)) < $tagClosePos || empty($tagClosePos))
				{
					$tagClosePos = strpos($str, '>', $i) - $i + 1;
				}
				else
				{
					$tagClosePos -= $i + 1;
				}
				$str = substr_replace($str, '', $i, $tagClosePos);
				$tagEnd = '</' . $tagCurrent . '>';
				$tagEndStartPos = strpos($str, $tagEnd, $i);
				$str = substr_replace($str, '', $tagEndStartPos, strlen($tagEnd));
				$j = strlen($str);
			}
			else
			{
				$openTags[] = $tagCurrent;
			}
		}
	}
	
	return $str;
}

echo replaceDouble($string);
?>
 
Zuletzt bearbeitet:
Zurück