Anzahl gleicher Zeichen in Text checken

fanste

Erfahrenes Mitglied
Hi,

Ich bin gerade dabei ein feritges Gästebuch etwas aufzubessern. Nun habe ich vor ein "textcheck" durchzuführen. Es gibt doch die Möglichkeit Zeichen/Buchstaben, die im text mehreremale direkt hintereinander kommen, zu löschen. Also soetwas wie es auch hier im Forum gibt (z.B. bei Fragezeichen).

Wie kann ich den Text am Besten nach aufeinanderfolgenden Zeichen absuchen? Ich komm da irgendwie auf keinen gescheiten Ansatz. Hab schon ein bisschen rumprobiert. kam aber meistens nur Käs bei raus.

Ich hoffe ihr könnt mir helfen.

Gruß fanste
 
Also ich bin mir jetzt nicht sicher, aber das müsste mit preg_replace() gehen.
Also:
PHP:
preg_replace('?', '?', $string);
In die erste Lücke musst du 2 Fragezeichen schreiben anstatt einem(werden gelöscht, wie du erkannt hast)
Wie man es allerdings automatisieren kann, also dass alles was doppelt ist erstezt wird weis ich nicht (ausser ein array basteln, in dem von a-z usw alles drinsteht)

MfG hab1cht
 
So ich habe nun etwas hinbekommen. Funktioniert auch einwandfrei. Der Code ist nur etwas lang für so einen Check finde ich. Bekomme ihn allerdings nicht kürzer. Vielleicht könnt ihr ja mal einen Blick draufwerfen.
PHP:
<?
function check($text)
{
	$aktchar = "";
	$aktcharcount = 0;
	$delstart = array();
	$dellen = array();
	$j = 0;
	for($i = 0; $i < strlen($text); $i++)
	{
		if($aktchar == "")
		{
			$aktchar = $text[$i];
			$aktcharcount = 1;
    		$delstart[$j] = $i;
			$dellen[$j] = $i-$delstart[$j];
		}
		else
		{
			if($aktcharcount < 4)
			{
				if($text[$i] == $aktchar)
				{
					$aktcharcount++;
				}
				else
				{
					$j++;
					$aktchar = $text[$i];
					$aktcharcount = 1;
					$delstart[$j] = $i;
					$dellen[$j] = $i-$delstart[$j];

				}
			}
			else
			{
				if($text[$i] == $aktchar)
				{
					$dellen[$j] = $i-$delstart[$j];
				}
				else
				{
					$j++;
					$aktchar = $text[$i];
					$aktcharcount = 1;
					$delstart[$j] = $i;
					$dellen[$j] = $i-$delstart[$j];
				}
			}
		}

	}
	$newtext="";
	$start = 0;
	for($i=0;$i<count($delstart);$i++)
	{
		$newtext .= substr($text,$start,($delstart[$i]+1-$start));
		$start = $delstart[$i] + $dellen[$i] + 1;
	}
	return $newtext;
}

$text = "ttttthhhjjk?"; //(5*?)
echo check($text)."<br>";
echo $text;
?>
 
Versuchs mal damit:
PHP:
<?php
$string = "test? test test?";

$regex = "/[?]{1,}/";

$new = preg_replace($regex, "?", $string); 

echo $new;
?>
PS: In $string sind natürlich sehr viel mehr Fragezeichen, die werden aber vom Forum gelöscht!.

greetz
daddz
 
Und wie bekommt man es bei deinem Beispiel hin, dass jedes zeichen so gesucht, gefunden und ersetzt wird? Ider geht das nur, wenn ich da ein Array erstelle, welches alle Pattern für die einzelnen Zeichen enthält?
 
Welche Zeichen sollen denn ersetzt werden? Ausrufezeichen? Fragezeichen? Oder mehr als 3 selbe Zeichen hintereinander?

Letzteres ließe sich leicht umsetzen, indem man den Regulären Ausdruck leicht abändert.

greetz
daddz
 
Ach was. Sind doch fast gleich lang ^^

Wenn du noch so nett wärest mir die einzelnen Abschnitte zu erklären, wäre es perfekt. Ein paar Sachen weiß ich. Aber was hat diese "\1" und "(.)" dort zu bedeuten? Ich kenne nur "(.*)".
 
  • . bedeutet: beliebiges Zeichen
  • Ein rundes Klammernpaar grenzt einen Ausdruck ab
  • \1 stellt einen Platzhalter für den ersten Ausdruck dar. Wird also durch das (.) ein „a“ gefunden, so steht \1 für a

Auf gut Deutsch liest sich der reguläre Ausdruck also als: Finde ein beliebiges Zeichen, hinter dem dieses Zeichen noch mindestens viermal steht.
 
Dann bedeutet dieser Ausdruck also soviel wie (in Worten)
'/(.)\1{4,}/'
/ = Begrenzer
(.) = finde ein (stimmt das, oder können es auch mehrere sein?) beliebiges Zeichen und
\1 = setzte es hierfür ein.
{4,} = finde von diesem Zeichen mindestens vier vorkommen und ersetzte sie mit einem Zeichen (\1)

Wenn ich richtig liege, bedeutet ja (.) das nur EIN Zeichen genommen wird. um alle zu nehmen, die an diesem Platz stehen könnten muss man dann also (.*) nehmen.
 
Zurück