login  Naam:   Wachtwoord: 
Registreer je!
 Forum

aantal str_replaces bijhouden

Offline Nrzonline - 02/07/2007 17:40 (laatste wijziging 02/07/2007 17:42)
Avatar van NrzonlinePHP ver gevorderde Beste,

Ik heb een scripte, die de slechte woorden uit de chat filtert.
Echter wil ik een hele zin gaan replacen als er meer dan 3 gefilterde woorden in zitten.

  1. <?PHP
  2. $aFilter = array ("woord1", "woord2", "woord3");
  3. for ($i=0; $i<count ($aFilter); $i++)
  4. {
  5. $sMessage = str_replace ($aFilter[$i], "*filter*", $sMessage);
  6. }
  7. ?>


Hoe kan ik bijhouden hoeveel woorden er dus daadwerkelijk zijn gereplaced?

Alvast bedankt,
Edwin ter Horst (Nrzonline)

*edit: typfout*

12 antwoorden

Gesponsorde links
Offline TotempaaltJ - 02/07/2007 17:47
Avatar van TotempaaltJ PHP interesse Uhm... Ik denk... Ik denk dat je ong dit moet doen:
  1. <?php
  2. $aantal = '0';
  3. $aFilter = array ("woord1", "woord2", "woord3");
  4. for ($i=0; $i<count ($aFilter); $i++)
  5. {
  6. $aantal++;
  7. $sMessage = str_replace ($aFilter[$i], "*filter*", $sMessage);
  8. }
  9. ?>


Oke, het is waarschijnlijk fout, ik ben niet zo'n expert met ++, maar miss helpt het! 
Offline ikkedikke - 02/07/2007 18:09
Avatar van ikkedikke PHP expert zo tel je het aantal woorden. Je kan beter het aantal keer dat je foute woorden voorkomen tellen.
http://www.php....-count.php
Offline Nrzonline - 02/07/2007 19:06 (laatste wijziging 02/07/2007 19:16)
Avatar van Nrzonline PHP ver gevorderde bigboss @ sorry, leuk geprobeerd, maar als je logisch nadenkt...
Je telt nu voor elke lus herhaling er +1 bij op. Ofterwijl, altijd 3 in dit geval, aangezien er 3 records in de array zitten. En een integer (getal) laat je buiten quotes ;) Toch bedankt 

@ikkedikke, dat is niet (zover ik weet) wat ik zoek. Hij returned een integer, maar hij moet gewoon de str_replace uitvoeren en op een manier bijhouden of hij wel of niet gereplaced is. Mocht het volgens jouw wel met substr_count kunnen, gelieve dit nader uit te leggen.

Hier wat meer uitleg over mijn probleem..
  1. <?PHP
  2. $string = "hier komen een aantal worden in voor";
  3. $string = str_replace ("homo", "*filer*", $string);
  4. # Hier komt 'homo' niet in voor, dus is het een geldige zin.
  5. # Er hoeft hier dus geen getal te worden bijgehouden.
  6.  
  7. $string = "homo?, dit is een voorbeeld!";
  8. $string = str_replace ("homo", "*filter*", $string);
  9. # Hier komt 'homo' WEL in voor, dus hij wordt gereplaced naar *filter*.
  10. # Nu moet er dus op een manier worden gekeken of er dus daad-
  11. # werkelijk een replace heeft plaats gevonden, en dus +1 ergens
  12. # in wegschrijven.. Maar hoe?!
  13. ?>

Offline Rens - 02/07/2007 19:29 (laatste wijziging 02/07/2007 19:30)
Avatar van Rens Gouden medaille

Crew algemeen
Je zou kunnen exploden op een . zodat je alle zinnen in een array hebt.
Daarna zou je per zin kunnen exploden op een spatie.
Dan heb je dus zoiets:
  1. 0 => array (
  2. woord1,
  3. woord2
  4. )
  5. 1 => array (
  6. woord1,
  7. woord2
  8. )
  9. )

Daar loop je doorheen, tel je de woorden die gereplaced worden.
Dan maak je nog een array aan voor zinnen die gereplaced moet worden.
Even die replacen.
Klaar 
Offline JBke - 02/07/2007 20:13
Avatar van JBke PHP gevorderde waarom geen preg_match gebruiken voor je zoektocht naar slechte woorden, dan kan je iets maken dat indien het woord niet exact matcht maar voldoende overeenkomsten heeft, het woord ook word vervangen. dan kan je gewoon elke keer er een match is je teller verhogen en indien bvb aan 3 doe je een break van je lus en voer je een andere replace uit voor de hele zin. Ik neem aan dat je toch iets zult moeten gebruiken om te zien waar je zin begint en waar die eindigd.
Offline Nrzonline - 02/07/2007 20:18 (laatste wijziging 02/07/2007 20:35)
Avatar van Nrzonline PHP ver gevorderde @Rens: Ja, als het dan ook nog mogelijk is om met wildcards te gaan werken, fine.. Maar ik zou zo geen idee hebben hoe ik dat moet gaan doen 

Stel je voor, je hebt "supermafkees is die jongen toch!", en het woordje "mafkees" staat als verboden woord.. Dan ga je die zin
exploden:
  1. 'supermafkees',
  2. 'is',
  3. 'die',
  4. 'jongen',
  5. 'toch!'
  6. )


de in_array() zal geen 'mafkees' in de 'supermafkees' niet zien.. Ofterwijl hij wordt niet gefilterd. Terwijl str_replace er super*filter* van zou maken.

@JBke, ook daar geld dat een woord zoals "heellelijk" niet wordt gereplaced als "lelijk" het woord is wat niet is toegestaan..
Offline JBke - 02/07/2007 20:25 (laatste wijziging 02/07/2007 20:30)
Avatar van JBke PHP gevorderde dat bedoel ik dus als je ineens een preg_match door je zin haald voor alle woorden in je te controleren tekst heb je dat probleem dus niet. Werk je dan ineens met preg_replace dan word het woord ook ineens vervangen en als de teller aan bvb 3 zit kan je met break je lus doorbreken om dan ineens de hele zin te vervangen.

Nu even geen tijd genoeg om dit ineen te steken. opgelet preg_match is eventueel wel iets trager en zeker iets moeilijker om ineen te steken.:D zou zeggen een goede uitdaging dus.

Je kan steeds nog gaan combineren uiteraard het Idee van Rens is zeker goed daar kan je eventueel met preg_match gaan werken op de woorden zodat supermafkees toch word vervangen indien enkel mafkees in je lijst staat. Je kan uiteraard de uitdaging aannemen en alles in 1 of 2 preg_matchen te gaan schrijven met daar ineens de controle van leesteken bij.
Offline Nrzonline - 02/07/2007 20:46 (laatste wijziging 02/07/2007 21:10)
Avatar van Nrzonline PHP ver gevorderde Is zien hoever ik kom 

  1. <?php
  2. $array = array("woord1", "woord2", "woord3");
  3. $aantal = 0;
  4. for ($i=0; $i<count($array); $i++)
  5. {
  6. if (preg_match("/\\" . $array[$i] . "\b/i", "PHP is woord1 the website woord2 scripting language of choice."))
  7. {
  8. $aantal++;
  9. }
  10. }
  11. echo $aantal; //2
  12. ?>


Dit werkt half, aangezien hij 2 verschillende woorden wel als 2 weergeeft, echter 2 keer hetzelfde woord wordt als 1 weergegeven..
Offline Rens - 02/07/2007 21:12
Avatar van Rens Gouden medaille

Crew algemeen
Nrzonline, mafkees word in dat geval wel vervangen hè...
Je loopt door die array heen, en dan komt hij wel "suoermafkees" tegen, maar dat replaced hij alsnog voor "super*filter*"...
Offline JBke - 02/07/2007 21:17 (laatste wijziging 02/07/2007 21:17)
Avatar van JBke PHP gevorderde natuurlijk vervangt hij het woord echter niet helemaal. bvb. supermafkees zal bvb vervangen worden door superverboden als verboden je replace woord is uiteraard. Ik zou in elk geval deze weg verder zetten zo leer je nog iets en is zeker te doen. Grtz.

@Rens: je was me voor was het aan het intypen en plots uw antwoord hehe.:D
Offline Rens - 02/07/2007 21:18
Avatar van Rens Gouden medaille

Crew algemeen
Dan typ jij ook niet snel 

En dan nog, je kunt ook alles gewoon in arrays gooien zoals ik eerder al zei, en vervolgens checken met eregi.
Dan zal hij wel het hele woord replacen...
Offline Nrzonline - 02/07/2007 21:57 (laatste wijziging 02/07/2007 22:06)
Avatar van Nrzonline PHP ver gevorderde
  1. <?PHP
  2. $sMessage = explode (" ", trim ($sMessage));
  3. $iFilter = 0;
  4. for ($i=0; $i < count ($sMessage); $i++)
  5. {
  6. if (in_array ($sMessage[$i], $aFilter))
  7. {
  8. $iFilter++;
  9. }
  10. }
  11. if ($iFilter < 4)
  12. {
  13. for ($j=0; $j < count ($aFilter); $j++)
  14. {
  15. # Replace the unallowed word with the filter.
  16. $sMessage = str_replace ($aFilter[$j], "<b><font color='red'>[*filter*]</font></b>", $sMessage);
  17. }
  18. }
  19. else
  20. {
  21. $sMessage = explode (" ", "<b><font color='red'>[*too much swearing, full sentence filter*]</font></b>");
  22. }
  23. ?>


*edit*
Ik heb hem al als 'opgelost' verklaard, maar dat is ie niet echt..
Want ik heb bijvoorbeeld 'fuck' als woord wat niet mag, en ik typ 'fucking', dan filtert hij wel het woord eruit, maar hij telt hem er niet bij op.. Hoe kan ik dit dan nu oplossen? 
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.29s