Avatar billede michaeltryl Seniormester
03. marts 2007 - 18:54 Der er 13 kommentarer og
1 løsning

erstat grimme ord

denne kode udskifter grimme ord i en tekst med pænere ord eller *** alt efter hvad der står i tabellen ban.

$ban = mysql_query("SELECT p_ord, g_ord FROM ban ORDER BY banid");
while($rs = mysql_fetch_array($ban))
{
    $bad[]= $rs['g_ord'];
    $good[]=$rs['p_ord'];
}
$ban_over = str_replace($bad, $good, $over);
$ban_tekst = str_replace($bad, $good, $tekstenen);

problemet er at hvis der i tabellen står "dumme" og ordret Dumme, DUMME fremkommer i teksten bliver det ikke erstattet.
kort sagt hvis ordret i feltet g_ord i datbasen ikke matcher ordret i teksten 100% bliver det ikke erstattet. Hvordan gør jeg så den kun kigger på stavemåden og ikke store/små bogstaver?
Avatar billede kalp Novice
03. marts 2007 - 19:23 #1
Måske kan du bruge denne funktion?

<?php
function str_contains($haystack, $needle, $ignoreCase = false) {
  if ($ignoreCase) {
      $haystack = strtolower($haystack);
      $needle  = strtolower($needle);
  }
  $needlePos = strpos($haystack, $needle);
  return ($needlePos === false ? false : ($needlePos+1));
}
?>


så kan du teste dine strings med denne funktion

$needlePos = str_contains('Jeg tester BaRe hehe', BaRe, true);
if ($needlePos) {
  echo 'Match fundet på position ' . ($needlePos-1);
}
?>

men du skal selvfølgelig bare benytte funktionen lidt anderledes...
Avatar billede coderdk Praktikant
03. marts 2007 - 19:42 #2
Bruger du PHP5 kan du bruge str_ireplace... Alternativt kan du bruge preg_replace ;)
Avatar billede michaeltryl Seniormester
03. marts 2007 - 21:05 #3
jeg kan ikke lige få den funktion til at spille som jeg godt vil.
til coderdk jeg skal bruge preg_replace, men ved ikke helt hvordan jeg skal gøre det da de eneste eksempler jeg kan finde indeholder en masse Regulære udtryk
Avatar billede coderdk Praktikant
03. marts 2007 - 21:14 #4
$ban = mysql_query("SELECT p_ord, g_ord FROM ban ORDER BY banid");
while($rs = mysql_fetch_array($ban))
{
    $bad[]= "/" . preg_quote( $rs['g_ord'], "/" ) . "/i";
    $good[] = $rs['p_ord'];
}
$ban_over = preg_replace( $bad, $good, $over );
$ban_tekst = preg_replace( $bad, $good, $teksten );
Avatar billede michaeltryl Seniormester
03. marts 2007 - 21:34 #5
jeg erstattede $ban_tekst = preg_replace( $bad, $good, $teksten ); med
$ban_tekst = preg_replace( $bad, $good, $tekstenen );
men det erstatter ingenting. heller ikke hvis ordet i tabellen matcher 100%
Avatar billede coderdk Praktikant
03. marts 2007 - 21:43 #6
Underligt. Dette eksempel fungerer, og det er hvad ovenstående script gør:

    $bad = array( "/dum/i", "/buh/i", "/muh/i", "/firefant/i" );
    $good = array( "ikkedum", "buhbuh", "ko", "elefant" );
    $teksten = "Hej! Jeg er ikke dUM. En ko siger Muh, ikke en fIREfant!";
    echo preg_replace( $bad, $good, $teksten );
Avatar billede michaeltryl Seniormester
03. marts 2007 - 22:02 #7
Ja den virker fint
min kode ser lige nu sådan ud. men hvis jeg har ordet "dum" i g_ord og skriver DUM i forummet bliver det ikke erstattet

$traaden = mysql_query("SELECT * ,DATE_FORMAT(dato, '%d') AS dato, DATE_FORMAT(dato, '%m') AS maaned, DATE_FORMAT(dato, '%Y') AS aar, DATE_FORMAT(dato, '%H:%i:%s') AS tid FROM forumtraad WHERE traadID = $traad AND spg = '0'") or die(mysql_error());
while ( $a = mysql_fetch_array($traaden))
{
$id = $a[traadID];
$overskrift = $a[overskrift];
$nyover = htmlentities($overskrift);
$over = nl2br("$nyover");

$tekst = $a[tekst];
$tekst = htmlentities($tekst);
$tekst = nl2br("$tekst");
$tekst = url2link($tekst);

$sbruger = $a[bruger];
$forfatter = $a[forfatter];
$dato = $a[dato];
$maaned = $a[maaned];
$aar = $a[aar];
$tid = $a[tid];

//tjekker hvilke ord der ikke er tilladte og erstatter med andre
$ban = mysql_query("SELECT p_ord, g_ord FROM ban ORDER BY banid");
while($rs = mysql_fetch_array($ban))
{
    $bad[]= "/" . preg_quote( $rs['g_ord'], "/" ) . "/i";
    $good[] = $rs['p_ord'];
}
$ban_over = preg_replace( $bad, $good, $over );
$ban_tekst = preg_replace( $bad, $good, $tekst );
//tjek slut
Avatar billede simplus Nybegynder
03. marts 2007 - 22:07 #8
brug en strtolower() til at gøre indholdet til små bogstaver og lav en tjek på det
Avatar billede coderdk Praktikant
03. marts 2007 - 22:14 #9
$bad[]= "/" . preg_quote( $rs['g_ord'], "/" ) . "/i";

gør netop at det er ligegyldigt om der står "dum", "dUm", "DUm", "DUM, eller "duM" :) /i betyder case insensitive... Så det burde efter min bedste overbevisning virke... Det *er* $ban_tekst og $ban_over du udskriver, ikke?
Avatar billede michaeltryl Seniormester
03. marts 2007 - 22:16 #10
coderdk dit forslag virker, det var mig som sad og testede på den forkerte side.
Jeg havde lavet en test side for at teste, men tjekkede om det virkede på den side jeg ikke rettede på. kort sagt en fejl 40 fra min side.
Bare kom med et svar. Tak for hjælpen
Avatar billede simplus Nybegynder
03. marts 2007 - 22:17 #11
ja den fylder ihvertfald en linie mindre end min ville :-)

havde ikke helt set den preg_quote...
Avatar billede coderdk Praktikant
03. marts 2007 - 22:46 #12
(c:
Avatar billede houmann76 Nybegynder
06. marts 2007 - 13:44 #13
Er i gang med noget af det samme, bare i ASP. Er der nogle af jer der har en liste med "de grimme ord", så der er noget at fodre databasen med fra starten?
Avatar billede michaeltryl Seniormester
06. marts 2007 - 14:16 #14
jeg har ikke tilføjet nogen endnu. Tilføjer dem hen af vejen hvis det bliver et problem
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester