Max Anzahl an Smilys!

firstlord18

Erfahrenes Mitglied
Hallo,

ich habe folgende Funktion programmiert:

PHP:
 function replace_smilys($text) {
 	global $smilies;
 	$rep = array(	":)" => $smilies."/smile_new.gif",
 		    		":-)" => $smilies."/smile_new.gif",
 		    		";)" => $smilies."/wink_new.gif",
 		    		";-)" => $smilies."/wink_new.gif",
 		    		":(" => $smilies."/frown_new.gif",
 		    		":-(" => $smilies."/frown_new.gif",
 		    		":D" => $smilies."/biggrin_new.gif",
 		    		":-D" => $smilies."/biggrin_new.gif",
 		    		":|" => $smilies."/strange_new.gif",
 		    		":-|" => $smilies."/strange_new.gif",
 		    		"=)" => $smilies."/gumble_new.gif",
 		    		":rolleyes:" => $smilies."/rolleyes_new.gif",
 		    		":roll:" => $smilies."/rolleyes_new.gif"
 				);
 				
 	foreach ($rep as $code => $img) {
 		$text = str_replace($code, "<img src=\"".$img."\" />", $text);
 	}
 	return $text;
 }

nun wollte ich wissen, wie ich es machen könnte, dass nur eine begrenzte Anzahl an Smilys erlaubt ist?
Vielen Dank!
 
Wenn du deinen Smilies Beispielsweise allen ein und das selbe merkmal beispielsweise den "-" geben würdest, dann könntest du das Zählen. Aber es wäre eben ziemlich ungenau, wenn ein User denn mal im Fließtext einen Bindestrich verwendet.
Des weiteren kannst du auch den Text ganz einfach durchsuchen.

PHP:
$count=0;
for($i=0;$i<strlen($text);$i++) {
    if ($text{$i}==':)') $count++;
    if ($text{$i}==':-)') $count++;
    if ($text{$i}==';)') $count++;
    if ($text{$i}==';-)') $count++;
}

Vielleicht gibts dafür auch ne PHP Funktion!

Gruß BSA

# Edit

Und jetzt musst du natürlich noch $count Auswerten!
 
Leider funktioniert das so nicht, da er ja mi deiner Schleife in 1er Schritten im Text weitergeht, und somit nie ein Buchstabe diesen Smilycode geben kann :(
 
Oh mist, da hast du recht, ziemlich dumm!

Was ist wenn du die erste von mir genannte Variante versuchst?
Oder aber du bastelst dir ne Funktion zusammen die aus Regulären Ausdrücken besteht und du für jeden einzelnen Smilie einen Regulären ausdruck erstellst!
 
Du könntest eine Funktion aufrufen, welche das Replacement zurückliefert.
In dieser Funktion zählst du bei jedem Aufruf einen Zähler hoch... solange, bis der Maximalwert erreicht ist....ansonsten verlässt du die Funktion sofort.
 
Coutn ergibt 0 hierbei:
PHP:
  <?php
  $text = ":) :-) ;) ;-) ;) :(:-)";
  $count=0;
  for($i=0;$i<strlen($text);$i++) {
  	if ($text{$i}==':)') $count++;
  	if ($text{$i}==':-)') $count++;
  	if ($text{$i}==';)') $count++;
  	if ($text{$i}==';-)') $count++;
  }  
  echo $count;
  ?>

Das dumme an Regulären Ausdrücken bzw an der FUnktion str_replace ist, dass man nicht weiß, wie oft nun replaced wurde! :(


Edit: @Sven: wie denn? bei str_replace weiß ich ja nicht, wie viel mal etwas replaced wurde :/
 
PHP:
<?php

$rep = array(    
  ":)"          => "smile",
  ";)"          => "wink",
  ";-)"         => "wink",
  ":("          => "frown",
  ":-("         => "frown",
  ":-)"         => "biggrin",
  ":-D"         => "biggrin",
  ":|"          => "strange",
  ":-|"         => "strange",
  "=)"          => "gumble",
  ":rolleyes:"  => "rolleyes",
  ":roll:"      => "rolleyes"
 );

$pattern=array();

foreach($rep as $k => $v)
  {
    array_push($pattern,preg_quote($k,'@'));
  }
 
function replace_smiley($s)
{
  global $rep;
  foreach($rep as $k => $v)
    {
      if($k == $s)
        {
          return '<img src="smileydir/' . $v . 
                 '_new.gif" alt="'. $v. '">';
        }
    }
}

function replace_smileys($text,$max) 
{
  global $pattern;
  return preg_replace('@('.implode('|',$pattern).')@e',
                      "replace_smiley('\\1')",
                      $text,
                      $max);
}  

?>

beim Parameter $max für replace_smileys() kommt die Anzahl der erlaubten Smileys hin.
 
Zurück