Woord vervangen.

Status
Niet open voor verdere reacties.

Tha Devil

Moderator
Forumleiding
Moderator
Lid geworden
1 sep 2002
Berichten
16.494
Besturingssysteem
macOS Sequoia
Ik ben bezig met een gastenboekje voor een vriend van mij, nu heb ik een woordfilter ingebouwd die dus scheld woorden eruit moet halen. (Woorden zijn via een database)

Nu heb ik dus het al zover dat ik met ucfirst(), strtoupper() en strtolower() deze woorden er uit worden gehaald: melk, MELK, Melk. Maar ik wil ook niet dat er een grapjas komt die deze combinatie gaat gebruiken: MeLk, mELK , mElK. Want deze worden met de code die ik nu heb niet gewijzigd :(

Ik zoek dus een functie/code die eerst het gehele bericht strtolower() doet en daarna de controle doet. Maar als iemand dan een punt invoert moet de volgende letter dus weer een hoofdletter zijn...

Ik denk dat het zoiets moet zijn, alleen heb ik dat met die hoofdletter er dan nog niet in:( :
PHP:
$woord = "melk";
$bericht = "MeLk is goed voor elk, en mELK komt van een koe. Dat weet toch iedereen."; 

$woord = strtolower($woord); //Mocht er in de database iets staan met hoofdletters
$bericht = strtolower($bericht);
$vervang = str_repeat("*", strlen($woord));
$bericht = str_replace($woord, $vervang, $bericht);

Maar dan heb ik dus nu uiteindelijk deze output:
"**** is goed voor elk, en **** komt van een koe. dat weet toch iedereen.

Terwijl ik het graag zo wil hebben:
**** is goed voor elk, en **** komt van een koe. Dat weet toch iedereen.

Iemand een idee?
 
ik heb er wel een paar,
kopieer je string naar een tweede, zeg nu tmp
zet die naar lowercase,
zoek dan de 'position' waar een scheldwoord begint, en waar het eindigd, en vervang dat gedeelte door ****

Code komt er drct aan
 
PHP:
// destring is je beginstring...
$tmp = strtolower($destring);
$pos = strpos($tmp,"melk");
$endstring = substr($destring,0,$pos) . substr($destring,$pos + 5);
//endstring je je output, de gefiltreede string...

als er fouten in zitten zeg het dan:)
 
Laatst bewerkt:
Zou je zo aardig willen zijn mijn gedeelte van de code erbij te gebruiken. Ik heb nou geen idee waar ik jou code in moet voegen...
 
PHP:
$woord = "melk";
$bericht = "MeLk is goed voor elk, en mELK komt van een koe. Dat weet toch iedereen."; 
$tmp = strtolower($bericht);
$pos = strpos($tmp,$woord);
$endstring = substr($destring,0,$pos) . "***" .  substr($destring,$pos + strlen($woord) + 1);
$bericht = $endstring;

tataa:)
 
Script werkt niet echt, hij haalt mijn hele bericht weg en vervangt het door 3 sterretjes... Tja is ook een manier van woordfilteren: Gewoon geen bericht laten zien...
 
Bekijk de functie preg_replace () eens op php.net.

Klein voorbeeldje:

PHP:
$badword = 'arre';
$vervang = '**';

$bericht = preg_replace ( '/' . $badword . '/i', $vervang, $bericht );

Als je met loops gaat werken (en dus met array's), zet dan bij elk badword '/' voor en '/i' achter. /i geeft aan dat het hoofdletter gevoelig is.

Groter voorbeeldje:

PHP:
// Je hebt zelf al query uitgevoert met badwords en vervanging (of je hebt een $variable dat vervanging is, wees creatief.

$badwords = array ();
$replacements = array ();

while ( $rij = mysql_fetch_assoc ( $result ) )
{
  $badwords[] = '/' . $rij['badword'] . /'i'; // Merk de / en /i op.
  $replacements[] = $rij['vervang'];
}

$bericht = preg_replace ( $badwords, $replacements, $bericht );

Beide voorbeelden zijn untested, maar als je ff naar de functie preg_replace kijkt kan je er ook wel zelf uit komen :)

Btw, arre. Twee keer 'n post waar je eigenlijk geen klap aan hebt ? :)
 
Geplaatst door masterprut
Bekijk de functie preg_replace () eens op php.net.

Btw, arre. Twee keer 'n post waar je eigenlijk geen klap aan hebt ? :)

Dankje hoor...
Je hebt er eigelijk wel een klap aan...
Ten eerste de reden dat je drie sterretjes krijgt is omdat ik zo vlug mogelik alles in zijn script moest gooien, vergetend dat wat variablen moesten worden aangepast...
En ok ookal doe je dat dan werkt het nog niet omdat het er meerdere keren instaat, wat je kan oplossen met een while lus jaja...

Maar weet je wat echt stoer zou zijn? Als nu die vragenstellers de moeiten zouden doen om zelf php te leren i.p.v. sarcastische opmerkingen te maken....
 
Geplaatst door masterprut
/i geeft aan dat het hoofdletter gevoelig is.
*kuche* hoofdletter-ongevoelig.
Geplaatst door arre
En ok ookal doe je dat dan werkt het nog niet omdat het er meerdere keren instaat, wat je kan oplossen met een while lus jaja...
Waarom heb je dat niet verholpen in de door jou eerder gegeven code ?
 
Laatst bewerkt:
Bedankt voor de off-topic bs mensen.

@MasterPrut: Ik zal mij eens gaan verdiepen in preg_replace ik had dat al een poos geleden willen doen, maar is er nooit van gekomen.

@JPeetje: Dus als ik die /i invoer maakt het niet uit hoe het woord er staat? Dan filtert hij er dus en MeLk en mELK ook uit?

dit is trouwens de code die ik ervoor gebruik @ the moment.
PHP:
$query2 = "SELECT woord FROM verbodenwoorden";
$result2 = mysql_query($query2);
// Tot nu toe staan de woorden [s]hit en [f]uck in de database
while($row2 = mysql_fetch_array($result2))
{
	extract($row2);		
	$woord = strtolower($woord);
	$vervang = str_repeat("*", strlen($woord));
	$bericht = str_replace($woord, $vervang, $bericht);
	$woord = ucfirst($woord);
	$vervang = str_repeat("*", strlen($woord));
	$bericht = str_replace($woord, $vervang, $bericht);
	$woord = strtoupper($woord);
	$vervang = str_repeat("*", strlen($woord));
	$bericht = str_replace($woord, $vervang, $bericht);
}

Zou ik hem dan in deze moeten veranderen?
PHP:
while ( $rij = mysql_fetch_assoc ( $result ) )
{
  extract($rij);
  $badwords[] = '/' . $woord . /'i';   
  $replacements[] = str_repeat("*", strlen($woord));
  $bericht = preg_replace ( $badwords, $replacements, $bericht );
}

Ik zal het strax testen, maar post de "onzekerheid" nu toch maar even zodat jullie mij op enige/meerdere fouten kunnen wijzen.
 
Geplaatst door Tha Devil
@JPeetje: Dus als ik die /i invoer maakt het niet uit hoe het woord er staat? Dan filtert hij er dus en MeLk en mELK ook uit?
Jup.
 
Dank u Masterprut, ik kreeg eerst nog wel een error maar dat kwam hierdoor:
PHP:
$badwords[] = '/' . $woord . /'i';
Je had de / buiten de ' gezet.

Deze code heb ik nu en hij werkt :thumb:
PHP:
$query2 = "SELECT woord FROM verbodenwoorden";
$result2 = mysql_query($query2);
$badwords = array ();
$replacements = array ();
while($rij2 = mysql_fetch_assoc($result2))
{
  extract($rij2);
  $badwords[] = '/' . $rij2['woord'] . '/i';   
  $replacements[] = str_repeat("*", strlen($woord));
}
$bericht = preg_replace ( $badwords, $replacements, $bericht );

@JP: Bedankt voor de bevestiging :D

[edit]
Valt me trouwens op dat ik extract($rij2); heb gebruikt en daarna toch $rij2['woord'] gebruik, haal ik extract weg dan haalt hij gewoon de "verbodenwoorden" weg dus zijn die plekken in een tekst leeg :8-0:
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan