Avatar billede webweaver Praktikant
08. oktober 2005 - 00:27 Der er 26 kommentarer og
1 løsning

strtolower and strtoupper

Hej prof's :)

Jeg har i øjeblikket et problem. Jeg har brug for at finde nogle bestemte ord i nogle indlæg, og så gøre dem til små.. Det vil sige alle de bestemte ord, som indeholder et stort bogstav, skal gøres små..

Indtil videre har jeg gjort sådan:

$besked = str_replace (strtoupper($ord_censur, strtolower($ord_censur), $besked);

Men det virker desværre ikke :( Eksempelvis, hvis ordet skole er et som den leder efter, så vil det kun virke hvis der står SKOLE.. Altså SKOLE vil blive til skole, som det skal, men fx Skole eller skolE, vil ikke ændre sig.. Det vil forblive som det står, og det er et problem!

Hvordan kan jeg få den til at blive småt, ligemeget om hele ordet er med stort eller kun enkelte bogstaver i ordet.. ?

På forhånd tak :) :D

Mvh. Lasse Jensen
Avatar billede pidgeot Nybegynder
08. oktober 2005 - 00:32 #1
Brug $besked = str_replace (strtoupper($ord_censur, strtolower($ord_censur), strtoupper($besked));

Dette gør dog at den også vil erstatte ord med den korrekte case, så det er muligvis ikke den mest effektive måde at gøre det på.
Avatar billede nielle Nybegynder
08. oktober 2005 - 00:33 #2
F.eks. vha. preg_replace:

$tekst = "noget tekst med ordet SkOlE i":
$tekst = preg_replace("/skole/i", "skole", $tekst);

Læs mere her:

http://dk2.php.net/preg_replace
Avatar billede webweaver Praktikant
08. oktober 2005 - 00:51 #3
Well, jeg tror ikke jeg kan bruge preg_replace..

Det er en ord_censur, så henter nogle ord ud af en database.. Jeg ved ikke på forhånd hvilket ord som skal censures, om det er bandeord1 eller bandeord2.. Begge måske.. Ved heller ikke om der er skrevet bandeord1, BanDEorD1 eller BANDEORD1.. Det er nogle indlæg i en gæstebog..

Jeg kan ikke helt overskue, hvordan jeg kan få det til at virke sammen med preg_replace? Synes det virker lidt kompliceret.

Mvh. Lasse Jensen
Avatar billede webweaver Praktikant
08. oktober 2005 - 00:52 #4
Pidgeot: Hvis jeg gør sådan, så bliver hele beskeden med stort right? Det duer ikke rigtig, da det er indlæg i en gæstebog.. Det skal helst skrives, som brugeren skriver det..
Avatar billede pidgeot Nybegynder
08. oktober 2005 - 01:00 #5
Hm - jo, det har du egentlig ret i, min fejl.

Det du så kunne gøre var noget i stil med følgende:

$censorquery=mysql_query("SELECT * FROM censor");
while ($row=mysql_fetch_array($censorquery))
{
  $tekst = preg_replace("/$row['badword']/i", "$row['goodword']", $tekst);
}
Avatar billede webweaver Praktikant
08. oktober 2005 - 01:07 #6
Jamen når det bliver gjort på den der måde der, er det så ikke mere eller mindre det samme som at bruge str_replace? Altså, hvor jeg har badword først, derefter det som badword skal erstattes med (goodword)? For mig at se, er det det samme. Men det laver ikke problemet med store og små bogstaver?

Mvh. Lasse Jensen
Avatar billede pidgeot Nybegynder
08. oktober 2005 - 01:10 #7
Nej - det i der er sidst i den første parameter fortæller at den skal lave en case-insensitive sammenligning. Den du havde lavet kigger eksplicit kun efter ordet hvis det kun er med store bogstaver.

Du bør dog måske lige se efter om der er nogle lignende funktioner der ikke kræver regulære udtryk, da disse har tendens til at være "dyrere" end aldmindelig erstatning.
Avatar billede pidgeot Nybegynder
08. oktober 2005 - 01:12 #8
Yes, her har vi den:

$besked = str_ireplace ($ord_censur, strtolower($ord_censur), $besked);
Avatar billede pidgeot Nybegynder
08. oktober 2005 - 01:12 #9
Den kræver dog at din server kører PHP5 - gør den ikke det, skal du bruge preg_replace løsningen.
Avatar billede webweaver Praktikant
08. oktober 2005 - 01:13 #10
Jeg vil teste det..  :) Thanks for hjælpen indtil videre! :D

Jeg vidste ikke det der med i'et.. Det var dejligt at lære! :D
Avatar billede nielle Nybegynder
08. oktober 2005 - 01:28 #11
i'et står simpelthen for "ignore case". Som et alternativ 08/10-2005 01:00:34

$badWords = array();
$goodWords = array();

$censorquery = mysql_query("SELECT * FROM censor");
while ($row = mysql_fetch_assoc($censorquery))
{
    $badWords[] = $row["badword"];
    $goodWords[] = $row["goodword"];
}

$tekst = preg_replace($badWords, $goodWords, $tekst);

... eller med et enkelt goodword:

$badWords = array();

$censorquery = mysql_query("SELECT * FROM censor");
while ($row = mysql_fetch_assoc($censorquery))
{
    $badWords[] = $row["badword"];
}

$tekst = preg_replace($badWords, "...", $tekst);
Avatar billede webweaver Praktikant
08. oktober 2005 - 10:44 #12
Jeg kan desværre ikke benytte $besked = str_ireplace ($ord_censur, strtolower($ord_censur), $besked); da jeg ikke koder i PHP5 endnu.. Eller bruger det på serveren..

Jeg har forsøgt mig med preg_replace. Og det virker sådan i princippet, men den laver også nogle fejl. Altså, for det første.. Nu censurerer den kun ord som indeholder 1 eller flere store bogstaver.. Men det er nok ikke så stort et problem, for kan altid have en str_replace ved siden af, som tager sig af de små bogstaver i ord.. Det undrede mig bare at den ikke klarer det hele preg_replace..?

Men det lidt større problem er at hvis der i beskeden for eksempel står:

Bandeord1 BANDEORD1 eller BAnDEord1 bandeorD1.. Så bliver det censureret til at være ******************* .. Det er jo ikke meningen. Ja den skal skrive stjerner i stedet for ordet, men problemet er den også tager og censurerer mellemrummet mellem de 2 ord.. Og det må den ikke!..

Hvad gør man mod dette? Kan ikke helt se hvorfor den gør det.

På forhånd mange tak! :)

Med venlig hilsen Lasse Jensen
Avatar billede nielle Nybegynder
08. oktober 2005 - 10:50 #13
Hvordan ser din kode ud?
Avatar billede webweaver Praktikant
08. oktober 2005 - 11:00 #14
Koden kan ses her; http://pastebin.com/386931
Avatar billede nielle Nybegynder
08. oktober 2005 - 13:21 #15
Et spørgsmål: Hvorfor har du denne linje:

$ord_censur_split = explode(" ", $ord_censur);

Er det fordi at du nogen gange har mere end et enkelt ord i "ord"-feltet i din "ord_censur" tabel? Hvis ja, hvordan ser et eksempel på dette så ud?
Avatar billede webweaver Praktikant
08. oktober 2005 - 13:29 #16
Øhm, jamen jeg har flere ord i databasen.. Og de ligger ikke i samme celle.. Det er derfor..

Kan du hjælpe med det andet? ;)
Avatar billede nielle Nybegynder
08. oktober 2005 - 13:32 #17
Jeg skal nok hjælpe, men jeg skal lige forstå din tabel først. Det er klart at du har flere censur-ord i din tabel. MEN ligger de som et ord pr. række i tabbellen, eller ligger de alle sammen i den samme række.

Altså ligger de sådan her:

svin
røv
nar

- eller ligger de sådan:

svin nar røv
Avatar billede webweaver Praktikant
08. oktober 2005 - 13:38 #18
Nope, det ligger i flere rækker.. Det var det jeg mente med at de ikke lå i samme celle ;) Jeg kunne bare ikke huske hvad det hed, så kaldte det celle.. hehe.. Men ja, de ligger i flere forskellige rækker.. Derfor jeg bruger explode();
Avatar billede nielle Nybegynder
08. oktober 2005 - 13:39 #19
Så er der da netop ingen grund til at bruge explode?
Avatar billede nielle Nybegynder
08. oktober 2005 - 13:58 #20
Prøv dette her:

// Her erstatter vi fx å med å, da ellers at HTML måden at skrive å på, vil snyde "tælle delen", som afgør hvor mange stjerner der skal vises.
// Hvis man ikke gjorde dette, så ville der hver gang man skrev å, komme 7 stjerner, fordi å er på 7 tegn.
$htmlDansk = array("æ", "Æ", "ø", "Ø", "å", "Å");
$dansk    = array("æ",      "Æ",      "ø",        "Ø",        "å",      "Å");
$besked = str_replace($htmlDansk, $dansk, $besked);

// Her angiver vi hvilket tegn det censurede ord skal erstattes med.
$censur_tegn = '*';

// Vi henter noget data fra tabellen "ord" i DB ud til en streng.
$sql = "SELECT ord FROM ord_censur ORDER by id ASC";
$query = mysql_query($sql) or die(mysql_error());

while ($row = mysql_fetch_assoc($foresp))
{
    $censur_ord = $row["ord"];
    $count_word = strlen($censur_ord);
    $censureret_ord = str_pad("", $count_word, $censur_tegn);

    $besked = preg_replace("/\b" . $censur_ord . "\b/i", $censureret_ord, $besked);
}

// Her sker så det geniale. Vi konventerer å til å igen, efter at "tælle delen" er kørt, men lige akkurat før beskeden bliver vist i gæstebogen.
// Dvs. at det nu igen er HTML måden som bogstaverne bliver vist på og man får ikke fejlen med stjernerne, og alle i verden kan nu se dem uden problemer :)
$besked = str_replace($dansk, $htmlDansk, $besked);
Avatar billede webweaver Praktikant
08. oktober 2005 - 14:10 #21
Okay tak, jeg kigger på det :) troede nu ellers jeg skulle bruge explode til at splitte strengen.? Men ihvertfald det virkede fint med explode.. bare ikke det med store og små bogstaver ;)
Avatar billede nielle Nybegynder
08. oktober 2005 - 14:13 #22
Du kunne have fjernet exploden, og din kode ville stadig væk have virket på samme måde.
Avatar billede webweaver Praktikant
08. oktober 2005 - 14:16 #23
mysql_fetch_assoc hvad gør den egentlig i forhold til  mysql_fetch_array?
Avatar billede nielle Nybegynder
08. oktober 2005 - 14:36 #24
Den er bare mere effektiv. Med mysql_fetch_array() kan du også gøre ting som at bede om værdien af $row[0] - altså data med index'et 0. Dette kræver selvfølgelig flere resourcer, end hvis du alligevel kun ønsker at få fat i $row["ord"].
Avatar billede webweaver Praktikant
08. oktober 2005 - 14:49 #25
Ja det er selvfølgelig rigtig nok..

Nå men dit script det virker lige som det skal :) Det er lidt surt, fordi vil jo gerne have lavet det selv og kunne have sagt det var mit.. Det kan jeg ikke længere.. Nå men sådan er det bare.. Det vigtigste er det virker korrekt nu :D Smiler..

Tak for hjælpen :) Smid et svar, så du kan få dine point.. ;)
Avatar billede nielle Nybegynder
08. oktober 2005 - 14:54 #26
En god del af ideerne i scriptet er faktisk dine - og alle kommentarerne :^)
Avatar billede webweaver Praktikant
08. oktober 2005 - 15:05 #27
Ja jeg kan se der er genbrugt lidt :) Det er jeg nu glad nok for, fordi det var første gang jeg skulle lave noget lignende det, så anede ikke om det var den "rigtige" metode.. Men det gik ret godt! :)

Tak for din hjælp :D

Med venlig hilsen Lasse Jensen
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