Smilies über PHP/Sql vor der ausgabe begrenzen******!

genion18

Grünschnabel
Hallöchen...

Und zwar möchte ich die smilies auf 3 Smilies begrenzen.

Wenn ein user:

Code:
$message =":) :D :) :D :) :) :D :) :D :)";
:) :D :) :D :) :) :D :) :D :)

eingibt, soll er

Code:
$message =":) :D :)";
:) :D :)

ausgeben.

hab hier mal die sql tabelle mit den smilies:
-id/image/text/größe des bildes-

Code:
INSERT INTO `icc_smilie` VALUES (1, 'allgemein/cbb5cd2d808801134082353254439458.gif', '#:)', '15');
INSERT INTO `icc_smilie` VALUES (2, 'allgemein/10b55f3aff368e43ab0ada7e3b4190f8.gif', '#:))', '15');
INSERT INTO `icc_smilie` VALUES (3, 'allgemein/1a1e302f3ea9d9184f9b7dc369b6c18b.gif', '#;)', '15');
INSERT INTO `icc_smilie` VALUES (4, 'allgemein/9d82944be4cdf1a24667ed92402c3f12.gif', '#:(', '15');
INSERT INTO `icc_smilie` VALUES (5, 'allgemein/a7d9ac508d4a7712aceea0ed0263b314.gif', '#:((', '15');


und hier das script:
Code:
function SmilieSwap($string) {

$abfrag = 'SELECT * FROM icc_smilie WHERE chat = "'.$chatadresse.'"';
$abfrage = mysql_query($abfrag); 
while ($row = mysql_fetch_object($abfrage)) {

		if((substr_count($string, $row->text) > 3) && $string != "") {
			$smilieSwap = explode(" " ,$string);
			if(is_array($smilieSwap)) {
				$smilieCount = 0;
				foreach($smilieSwap as $key => $value) {
					if($value == $row->text) {
						$smilieCount++;
 
						if($smilieCount > 3) {
							unset($smilieSwap[$key]);
						}
					}
				}
				$newString = implode(" ", $smilieSwap);
				return $newString;
			} else {
				return false;
			}
		}
	}
}

$message = "anfang :) dfsdf :) dfsdf :) dffdss :) ende :) ende2"; 
$smilie = new Smilie; 
$message = SmilieSwap($message);

Problem ist, das über array es wohl nicht klappt wie ich mir vorstelle und so über die abfrage auch nicht, da er wohl nix findet was er ableichen soll.

Hat einer eine idde wie man es lösen kann?

greets
 
Was besseres fällt mir dazu bis jetzt leider noch nicht ein:

PHP:
<?php

$message =":) :D :) :D :) :) :D :) :D :)";

$bild = array(
                'allgemein/cbb5cd2d808801134082353254439458.gif',
                'allgemein/10b55f3aff368e43ab0ada7e3b4190f8.gif',
                'allgemein/1a1e302f3ea9d9184f9b7dc369b6c18b.gif',
                'allgemein/9d82944be4cdf1a24667ed92402c3f12.gif',
                'allgemein/a7d9ac508d4a7712aceea0ed0263b314.gif'
            );

$smile = array(':)', ':))', ';)', ':(', ':D');

$message_array = explode(" ", $message);

$message = str_replace($smile, $bild, $message_array);

var_dump(array_slice($message, 0, 3));
?>
 
Du müsstest die Abbruchbedingung rausziehen und nicht in der Schleife den Counter immer wieder auf Null setzen
PHP:
$smilieCount = 0;
while ($row = mysql_fetch_object($abfrage) and $smilieCounter<4) 
{
 
        if((substr_count($string, $row->text) > 3) && $string != "") {
            $smilieSwap = explode(" " ,$string);
            if(is_array($smilieSwap)) {

                foreach($smilieSwap as $key => $value) {
                    if($value == $row->text) {
                        $smilieCount++;
 
                        if($smilieCount > 3) {
                            unset($smilieSwap[$key]);
                        }
                    }
                }
                $newString = implode(" ", $smilieSwap);
                return $newString;
            } else {
                return false;
            }
        }
    }
}
(nicht getestet)
 
Hallöchen...

also so wie das script jetzt ist, gibt er garnichtsmehr an $message aus:

Code:
function SmilieSwap($string) {
$abfrag = 'SELECT * FROM icc_smilie WHERE chat = "'.$chatadresse.'"';
$abfrage = mysql_query($abfrag);
$smilieCount = 0; 
while ($row = mysql_fetch_object($abfrage) and $smilieCount<4) {
 
        if((substr_count($string, $row->text) > 3) && $string != "") {
            $smilieSwap = explode(" " ,$string);
            if(is_array($smilieSwap)) {

                foreach($smilieSwap as $key => $value) {
                    if($value == $row->text) {
                        $smilieCount++;
 
                        if($smilieCount > 3) {
                            unset($smilieSwap[$key]);
                        }
                    }
                }
                $newString = implode(" ", $smilieSwap);
                return $newString;
            } else {
                return false;
            }
        }
    }
}  

$message = "anfang #:) dfsdf #:) dfsdf #:) dffdss #:) ende #:) ende2"; 
$smilie = new Smilie; 
$message = SmilieSwap($message); 
echo $message;

greets
 
Hallo!

Was besseres fällt mir dazu bis jetzt leider noch nicht ein:
Ich sehe folgende Probleme:
1. Die Smileys fangen nicht alle mit dem gleichen Zeichen an.
2. Die Smileys hören nicht alle mit dem gleichen Zeichen auf.
3. Die Smileys haben unterschiedlich viele Zeichen.
4. In der Variable $message müssen die Smileys nicht zwangsweise durch ein Leerzeichen getrennt sein.

Aus dieser Problematik heraus kann explode() so also schonmal nicht funktionieren.

Ich befürchte daher fast dass man um eine RegEx nicht drum rum kommt.
Da muss dann aber einer von den Profis ran.

Kleiner Gedankengang (ist aber alles nur reine Theorie, ob es so wirklich machbar ist, kann ich so auch nicht sagen):
Andernfalls müsste Zeichen für Zeichen extrahiert werden um zu prüfen ob das jeweilige Folgezeichen ein gültiges (im Smiley vorkommendes) Zeichen ist.
str_split($message) würde Dir ein Array mit den einzelnen Zeichen zurückgeben.
Nun wird in einer for-Schleife per if-Abfrage geprüft ob das 1. Zeichen ein : oder ; ist (mit array_count_values() kannst Du die Anzahl der Array-Einträge als Endzahl für die for-Schleife ermitteln).
Wenn nein, dann springe zum nächtes Array-Eintrag, wenn Ja, dann prüfe ob der nächste Array-Eintrag ein ), ( oder D ist.
Und so geht es immer weiter.
Und nicht vergessen bei jeder if-Abfrage einen Counter zu setzen (je nach Ergebnis entweder 0 oder 1), zu dem Du den jeweils vorherigen Counter-Wert hinzuaddierst.
Ausserdem erstellst Du bei Erfolg ein neues Array.
Irgendwann ist der Counter bei 3 angekommen.
Ab hier werden in das neue Array nurnoch die Zeichen gelegt, die kein Smiley ergeben.

Gruss Dr Dau
 
Hallo,
meine erste Idee war auch eine Regex.
Ich hab ein bisschen mit dem Online-Regex-Tester rumgespielt (http://regexp-tester.mediacix.de/exp/regex/)

Ein einfaches Beispiel:
PHP:
<?php 
$string = "wortA 12345678 wortB 23 wortC 345678 wortD"; 
$regex = "/([0-9]{1,3})[0-9]*/"; 
$replace = "\1"; 
$newString = preg_replace ($regex, $replace, $string, -1, $preg_replace_found ); 
echo "Found: ", $preg_replace_found; 
?>
Ergebnis:
Code:
Found: 3
wortA 123 wortB 23 wortC 345 wortD
Hier sollen alle aufeinander folgenden Ziffern nach drei Ziffern abgeschitten werden.
Die erste matching group ([0-9]{1,3}) matcht 1-3 Ziffern, die restlichen folgenden Ziffern [0-9]* werden nicht in eine matching group gespeichert. Die Ersetzung erfolgt dann durch die erste matching group \1.

Jetzt muss man nur noch die Ziffern durch den Smiley-Code ersetzen (und die Leerzeichen nicht vergessen):
PHP:
<?php 
$string = "wortA :D :D :D :D :D :D wortB :D :D wortC :D :D :D :D :D :D wortD"; 
$regex = "/(( :D){1,3})( :D)*/"; 
$replace = "\1"; 
$newString = preg_replace ($regex, $replace, $string, -1, $preg_replace_found ); 
echo "Found: ", $preg_replace_found; 
?>
Ergebnis:
Code:
Found: 3
wortA :D :D :D wortB :D :D wortC :D :D :D wortD

Jetzt müsste man nur noch alle möglichen Smileys in das Regex aufnehmen, aber das funktioniert noch nicht (keine Ahnung warum)
PHP:
<?php 
$string = "wortA :D :) :(( :D :)) :D wortB :D :( wortC :D :(( :)) :D :( :D wortD"; 
$regex = "/((( :D)|( :\))|( :\)\))|( :\()|( :\(\()){1,3})(( :D)|( :\))|( :\)\))|( :\()|( :\(\())*/"; 
$replace = "\1"; 
$newString = preg_replace ($regex, $replace, $string, -1, $preg_replace_found ); 
echo "Found: ", $preg_replace_found; 
?>
Ergebnis:
Code:
Found: 7
wortA :D :) :(( :D :)) :D wortB :D :( wortC :D :(( :)) :D :( :D wortD

Vielleicht gibt das einen Schubs in die richtige Richtung... :)
 
Das Problem was ich bei der Sache sehe ist wie unterschieden wird ob mehrere Smileys hintereinander stehen oder nicht.

":):):):):)" wäre einfach, ":) :) :) :)" auch noch. Aber wie sieht es damit aus ":) abc :) def :) ghi :)"?

Der Unterschied ist ja nur das sie einmal direkt und zusammen geschrieben sind, beim zweiten Beispiel ist jeweils ein Leerzeichen und beim dritten sind es halt ein paar Buchstaben.

Ich würde es an deiner Stelle vielleicht in der Art lösen:


PHP:
<?php

$message =":) :D :) :D :) bla bla bla :) Hund :D Katze :) Maus :D :)";

$smile = array (':)', ':))', ';)', ':(', ':((', ':D');

$treffer = 0;

for ($a = 0; $a < count($smile); $a++) {
	$treffer = $treffer + substr_count($message, $smile[$a]);
}


if ($treffer > 3) echo "Es sind zu viele Smileys im Text enthalten!";
?>
 
Hallöchen...

Ist ja schön und gut, aber erstens ließt er es noch immer nicht aus der Sql-Tabelle wie es soll und dann fehlt noch immer das das er wenn er die 3 Smilies gefunden hat nicht alle weiteren ausgibt als Image sowie text.

Aber das hauptaugenmerk ist immer noch das Problem, wie man die sql mit dem Script kombiniert.

Code:
<?php
$abfrag = 'SELECT * FROM icc_smilie WHERE chat = "'.$chatadresse.'"';
$abfrage = mysql_query($abfrag); 
while ($row = mysql_fetch_object($abfrage)) {
$smilie = $row[text]; // der text aber nicht das image
$smilieimage = $row[image]; // das image aber nicht der text und da besteht noch das problem alles beides zu setzen...

}

$message =":) :D :) :D :) bla bla bla :) Hund :D Katze :) Maus :D :)";

$smile = $vonsql;

$treffer = 0;

for ($a = 0; $a < count($smile); $a++) {
    $treffer = $treffer + substr_count($message, $smile[$a]);
}


if ($treffer > 3) echo "Es sind zu viele Smileys im Text enthalten!";
?>
 
Zuletzt bearbeitet:
Ist ja schön und gut, aber erstens...
Einen Kommentar dazu spare ich mir besser mal.

Aber das hauptaugenmerk ist immer noch das Problem, wie man die sql mit dem Script kombiniert.
Meiner Meinung nach das Hauptaugenmerk doch wohl eher das was ich oben schonmal geschrieben habe:
Das Problem was ich bei der Sache sehe ist wie unterschieden wird ob mehrere Smileys hintereinander stehen oder nicht.

Wenn du bei der Eingabe verhinderst das zu viele Smileys eingegeben werden, dann musst du sie später nicht herausfiltern. Würde meiner Meinung nach mehr Sinn machen und wäre mit meinem obigen Vorschlag möglich.
 
Hallöchen...

Da es sich um ein Chat handelt möchte ich nicht wie bei Webkicks das eine Meldung erscheint: "sie haben zuviele Smilies eingegeben" und den text neu verfassen müssen, stadessen einfach alle weiteren Smilies herrausfiltert und nicht ausgiebt.
 
Zurück