|
| Hvordan testes en tekststreng for at være ~ Fra : Jakob Munck |
Dato : 19-12-05 01:10 |
|
Jeg har lavet en engelsksproget portal og for at sikre at de danske brugere
ikke skriver på dansk, vil jeg godt teste indput i nogle forme for de mest
almindelige danske ord (jeg, og, men, at, der etc.) og hvis nogle af disse
forekommer, formodes indlægget at være på dansk, og afvises derfor. Men
hvordan skrives koden til at teste en tekststreng mod et array af "forbudte
ord"?
En start:
<?
$subject = $_POST["subject"];
danske_ord["jeg", "og", "men", "at", "der"];
if ($subject ='????'){
header("Location: forkert_sprog.php");
}
?>
Det var umiddelbart hvad jeg selv kunne præstere af kode, men det virker jo
ikke, og arrayet er nok heller ikke lavet korret. Hvordan får jeg lige teste
$subject op mod et array af forbudte ord?
v.h.
Jakob
| |
Benny Nissen (19-12-2005)
| Kommentar Fra : Benny Nissen |
Dato : 19-12-05 01:21 |
|
Jakob Munck wrote:
> danske_ord["jeg", "og", "men", "at", "der"];
Take a look at this ... (læg mærke til ordet 'at')
Pas på, at du får lavet en korrekt liste.
--
Benny Nissen
| |
Bertel Lund Hansen (19-12-2005)
| Kommentar Fra : Bertel Lund Hansen |
Dato : 19-12-05 09:05 |
|
Jakob Munck skrev:
> forekommer, formodes indlægget at være på dansk, og afvises derfor. Men
> hvordan skrives koden til at teste en tekststreng mod et array af "forbudte
> ord"?
Du skal bruge et flag som sættes til true (alt er okay) fra
starten. Hvis der så findes et forbudt ord, ryger flaget på
false.
$danske_ord = array ("jeg", "og", "der");
$okay=1;
$subject = $_POST["subject"];
foreach ($danske_ord as $danskord)
if (stripos($subject,$danskord)) $okay=false;
if (!$okay) fejl;
"Men" og "at" er fjernet fra din liste da det også er engelske
ord.
Jeg ville ikke smide folk til en ny side, men lade dem blive på
den samme og så give en fejlbesked.
--
Bertel
http://bertel.lundhansen.dk/ http://fiduso.dk/
| |
Jakob Munck (19-12-2005)
| Kommentar Fra : Jakob Munck |
Dato : 19-12-05 11:18 |
|
>
> $danske_ord = array ("jeg", "og", "der");
> $okay=1;
> $subject = $_POST["subject"];
>
> foreach ($danske_ord as $danskord)
> if (stripos($subject,$danskord)) $okay=false;
>
> if (!$okay) fejl;
>
Virker fint, tak for det.
> "Men" og "at" er fjernet fra din liste da det også er engelske
> ord.
>
Korrekt.
> Jeg ville ikke smide folk til en ny side, men lade dem blive på
> den samme og så give en fejlbesked.
>
God idé, det gør jeg.
Tak for hjælpen.
v.h.
Jakob
| |
Jakob Munck (19-12-2005)
| Kommentar Fra : Jakob Munck |
Dato : 19-12-05 12:59 |
|
Nedenståeden kode virker udmærket, men jeg forstår ikke hvorfor?
-------------------
$message = $_POST["message"];
$danske_ord = array (" jeg ", " og ", " en ", " ved ", " på ", " som ", " du
", " der ");
$okay=1;
foreach ($danske_ord as $danskord) //her mangler {}
if (stripos($message,$danskord)) $okay=false;
if (!$okay){
header("Location: only_english.php");
exit;
}
------------------------
To spørgsmål:
1. Så vidt jeg kan se mangler der {} efter det første if, medens det andet
er lavet ok. Hvordan kan det være at det virker?
2. Burde man ikke tildele variablen $okay ensartede modsvarende værdier,
altså enten true/false eller 0/1 ? (her er det 1/false)
v.h.
Jakob
| |
Niels (19-12-2005)
| Kommentar Fra : Niels |
Dato : 19-12-05 13:15 |
|
--
/Niels (Webmaster on NooP Web - www.niels.spoweb.dk - English:
www.niels.spoweb.dk/language.php?l=eng)
"Jakob Munck" <jm2_fjern_dette@webspeed.dk> skrev i en meddelelse
news:43a6a091$0$47035$edfadb0f@dread15.news.tele.dk...
> ...
> 1. Så vidt jeg kan se mangler der {} efter det første if, medens det andet
> er lavet ok. Hvordan kan det være at det virker?
> v.h.
> Jakob
>
Når man ikke bruger { og } benytter den kun den næste kommando altså:
if (hej) echo "hej";
else "Ikke hej";
eller
if (hej);
echo "hej;
else;
echo "ikke hej";
bare husk semikolon
| |
Bertel Lund Hansen (19-12-2005)
| Kommentar Fra : Bertel Lund Hansen |
Dato : 19-12-05 13:19 |
|
Jakob Munck skrev:
> foreach ($danske_ord as $danskord) //her mangler {}
> if (stripos($message,$danskord)) $okay=false;
Alle løkker og if-konstruktioner kan laves uden {}. Det er sådan
set udgangspunktet. Der kan følge én enhed bagefter. Hvis man så
har flere kommandoer der alle skal være underlagt betingelsen, er
man nødt til at slå dem sammen til én blok, og det gøres med {}.
Nogle laver så altid krusedullerne, også når der kun er ét
statement, men det gør jeg ikke.
> 2. Burde man ikke tildele variablen $okay ensartede modsvarende
> værdier, altså enten true/false eller 0/1 ? (her er det
> 1/false)
Jo, bestemt. Det er en svipser. Det virker problemfrit, men det
er ulogisk at læse.
--
Bertel
http://bertel.lundhansen.dk/ http://fiduso.dk/
| |
Peter Brodersen (19-12-2005)
| Kommentar Fra : Peter Brodersen |
Dato : 19-12-05 12:50 |
|
On Mon, 19 Dec 2005 09:04:56 +0100, Bertel Lund Hansen
<nospamfilius@lundhansen.dk> wrote:
>$danske_ord = array ("jeg", "og", "der");
>$okay=1;
>$subject = $_POST["subject"];
>
>foreach ($danske_ord as $danskord)
> if (stripos($subject,$danskord)) $okay=false;
For det første tjekker den blot om ordet optræder et sted i sætningen,
også inde i ord. Hvis man fx skriver "google", så vil den give fejl
(fordi "og" findes i det ord)
For det andet tjekkes der ikke returværdier korrekt. stripos
returnerer startpositionen, eller FALSE hvis den ikke findes, men hvis
det står som det allerførste i sætningen, vil stripos returnere 0
(hvilket evaluerer til false). Tjek fx:
if (stripos("jeg er glad","jeg")) print "Dansk!";
if (stripos(" jeg er glad","jeg")) print "Dansk!";
Kun den nederste vil outputte "Dansk!". Et bedre tjek vil fx være:
if (stripos("jeg er glad","jeg") !== FALSE) print "Dansk!";
Det er vigtigt at bruge !== i stedet for !=, idet !== også tjekker på
type.
(derudover er jeg ikke superbegejstret for at $okay skifter fra en int
til en bool, men det har ingen betydning for den øvrige kode)
--
- Peter Brodersen
Find dig selv: http://map.ter.dk/
| |
Bertel Lund Hansen (19-12-2005)
| Kommentar Fra : Bertel Lund Hansen |
Dato : 19-12-05 13:20 |
|
Peter Brodersen skrev:
> (derudover er jeg ikke superbegejstret for at $okay skifter fra en int
> til en bool, men det har ingen betydning for den øvrige kode)
Det er en ren svipser. Sådan skriver jeg heller ikke kode.
--
Bertel
http://bertel.lundhansen.dk/ http://fiduso.dk/
| |
Jakob Munck (19-12-2005)
| Kommentar Fra : Jakob Munck |
Dato : 19-12-05 13:24 |
|
Tak for jeres kloge kommentarer. Jeg lærer hele tiden. Herligt!
v.h.
Jakob
| |
Jakob Munck (19-12-2005)
| Kommentar Fra : Jakob Munck |
Dato : 19-12-05 13:36 |
|
>>foreach ($danske_ord as $danskord)
>> if (stripos($subject,$danskord)) $okay=false;
>
> For det første tjekker den blot om ordet optræder et sted i sætningen,
> også inde i ord. Hvis man fx skriver "google", så vil den give fejl
> (fordi "og" findes i det ord)
>
Det kan man vel løse ved at skriv Arrayet med de forbudt ord således:
array (" jeg ", " og ", " en ", " ved ", " på ", " som ", " du ", " der "
>
> if (stripos("jeg er glad","jeg")) print "Dansk!";
> if (stripos(" jeg er glad","jeg")) print "Dansk!";
>
> Kun den nederste vil outputte "Dansk!". Et bedre tjek vil fx være:
>
> if (stripos("jeg er glad","jeg") !== FALSE) print "Dansk!";
>
Ingen af disse 3 muligheder printer noget hos mig. Er der fejl i syntaksen?
v.h.
Jakob
| |
Arne Feldborg (19-12-2005)
| Kommentar Fra : Arne Feldborg |
Dato : 19-12-05 14:19 |
|
"Jakob Munck" <jm2_fjern_dette@webspeed.dk> skrev Mon, 19 Dec 2005
13:35:54 +0100
>Ingen af disse 3 muligheder printer noget hos mig. Er der fejl i syntaksen?
>
Nej. men Bertel glemte at skrive det her:
"stripos (no version information, might be only in CVS)"
Du kan slet ikke bruge stripos() i PHP ver 4.
--
mvh, A:\Feldborg
Slægtsforskning og lokalhistorie i midt- vestjylland
http://hammerum-herred.dk/
| |
Arne Feldborg (19-12-2005)
| Kommentar Fra : Arne Feldborg |
Dato : 19-12-05 16:13 |
|
"Jakob Munck" <jm2_fjern_dette@webspeed.dk> skrev Mon, 19 Dec 2005
13:35:54 +0100
>Det kan man vel løse ved at skriv Arrayet med de forbudt ord således:
>
>array (" jeg ", " og ", " en ", " ved ", " på ", " som ", " du ", " der "
>
Det vil så give andre problemer hvis ordet står først eller sidst i en
sætning. Jeg tror du skal ind og checke på hele ord i stedet for. Hvis
du har PHP ver 4. 3.0 eller højere kan du prøve noget i den her stil.
Det er ganske vis en lidt langsommere metode, især ved lange sætninger,
men jeg tror det vil virke mere sikkert. Og iøvrigt kan det da også godt
optimeres en del, hvis du har lyst.
<?php
$check_tekst = 'Dette er en sætning skrevet på dansk';
$check_antal = str_word_count($check_tekst);
$check_ord = str_word_count($check_tekst,1);
$danske_ord = array('dette', 'sætning', 'dansk');
$antal_danske_ord = count($danske_ord);
$dansk = 0;
for ($i=0;$i<$check_antal;$i++){
for ($j=0;$j<$antal_danske_ord;$j++){
if ($check_ord[$i] == $danske_ord[$j]){
$dansk = 1;
}
}
}
echo '<br>Dansk = '.$dansk;
?>
--
mvh, A:\Feldborg
Slægtsforskning og lokalhistorie i midt- vestjylland
http://hammerum-herred.dk/
| |
Bertel Lund Hansen (19-12-2005)
| Kommentar Fra : Bertel Lund Hansen |
Dato : 19-12-05 18:11 |
|
Jakob Munck skrev:
>> if (stripos("jeg er glad","jeg") !== FALSE) print "Dansk!";
> Ingen af disse 3 muligheder printer noget hos mig. Er der fejl i syntaksen?
Nu skrev du tidligere at det virkede med stripos(), men hvis den
ikke dur, kan du bruge strpos(). Forskellen er at den er
versalfølsom (gør forskel på små og store bogstaver). Derfor skal
du lave en kopi af din streng som du så sender gennem
strtolower(). Så kan du sammenligne med dine danske ord skrevet
med småt.
--
Bertel
http://bertel.lundhansen.dk/ http://fiduso.dk/
| |
Michael Zedeler (19-12-2005)
| Kommentar Fra : Michael Zedeler |
Dato : 19-12-05 16:50 |
|
Bertel Lund Hansen wrote:
> $danske_ord = array ("jeg", "og", "der");
> $okay=1;
> $subject = $_POST["subject"];
>
> foreach ($danske_ord as $danskord)
> if (stripos($subject,$danskord)) $okay=false;
>
> if (!$okay) fejl;
Der ser ud til at være en kedelig fejl i ovenstående, da det også søger
i delsekvenser af ord. F. eks. vil de engelske ord "fog", "derive",
blive genkendt som danske ord af algoritmen ovenfor.
Man kan iøvrigt også bare gøre sådan her:
if(preg_match("(^|\W)(jeg|og|der| <indsæt flere danske ord her>)(\W|$)",
$_POST["subject"])) echo "Dansk!";
Men der er stadig et generelt problem med denne sortliste-tilgang. For
det første skal man have en masse ord med, for at fange alle danske
indlæg. Det hjælper selvfølgelig en del, hvis du også kigger på
indholdet af selve indlægget, men alligevel.
Derudover risikerer man at fange indlæg, som egentlig er på engelsk,
hvis blot forfatteren af vanvare har indtastet blot et enkelt ord på dansk.
Man kan udbygge algoritmen ved at gøre sådan her:
$antal_ord = preg_match("(?:^|\W)(\w+)(?:\W|$)", $_POST["subject"]));
$antal_danske_ord = preg_match("(?:^|\W)(jeg|og|der| <indsæt flere
danske ord>)");
if($antal_danske_ord > ($antal_ord<5?$antal_ord:5)) echo "Dansk!"
Kodeeksemplerne er ikke afprøvet i praksis.
Mvh. Michael.
--
Which is more dangerous? TV guided missiles or TV guided families?
Visit my home page at http://michael.zedeler.dk/
Get my vcard at http://michael.zedeler.dk/vcard.vcf
| |
Martin (19-12-2005)
| Kommentar Fra : Martin |
Dato : 19-12-05 19:24 |
|
Jakob Munck wrote:
> Jeg har lavet en engelsksproget portal og for at sikre at de danske brugere
> ikke skriver på dansk, vil jeg godt teste indput i nogle forme for de mest
> almindelige danske ord (jeg, og, men, at, der etc.) og hvis nogle af disse
> forekommer, formodes indlægget at være på dansk, og afvises derfor. Men
> hvordan skrives koden til at teste en tekststreng mod et array af "forbudte
> ord"?
>
> En start:
>
> <?
> $subject = $_POST["subject"];
>
> danske_ord["jeg", "og", "men", "at", "der"];
if(in_array($danske_ord,$tekststreng)) {
print "dette er på dansk";
} else {
print "ingen danske ord";
>
> if ($subject ='????'){
> header("Location: forkert_sprog.php");
> }
> ?>
>
> Det var umiddelbart hvad jeg selv kunne præstere af kode, men det virker jo
> ikke, og arrayet er nok heller ikke lavet korret. Hvordan får jeg lige teste
> $subject op mod et array af forbudte ord?
>
>
> v.h.
> Jakob
>
>
| |
Peter Brodersen (19-12-2005)
| Kommentar Fra : Peter Brodersen |
Dato : 19-12-05 20:26 |
|
On Mon, 19 Dec 2005 19:24:26 +0100, Martin <news@natten-i.dk> wrote:
>if(in_array($danske_ord,$tekststreng)) {
> print "dette er på dansk";
>} else {
> print "ingen danske ord";
Det vil ikke virke. For det første skal der byttes om på de to
argumenter, og for det andet opdeler in_array ikke needle (altså
tekststrengen) i ord.
--
- Peter Brodersen
Find dig selv: http://map.ter.dk/
| |
Rune N. (19-12-2005)
| Kommentar Fra : Rune N. |
Dato : 19-12-05 12:54 |
|
Jeg ved godt at det ikke vil fange alle danske ord men hvad med blot at
søge efter æåø? Det fanger nok de fleste dansksproget indlæg. (Jeg har
i dette indlæg brugt 4xæ , 2xå og 2xø).
Problemet er nemlig som Benny Nissen også pointerer at man nemt kommer
til at udelukke engelske ord eller engelsk slang. Men det er jo helt op
til dig hvor grundigt du vil være.
Held og lykke med det...
| |
Jakob Munck (19-12-2005)
| Kommentar Fra : Jakob Munck |
Dato : 19-12-05 20:42 |
|
"Rune N." <mr_crimp@gmail.dom> skrev i en meddelelse
news:pan.2005.12.19.11.53.54.378004@gmail.dom...
> Jeg ved godt at det ikke vil fange alle danske ord men hvad med blot at
> søge efter æåø? Det fanger nok de fleste dansksproget indlæg. (Jeg har
> i dette indlæg brugt 4xæ , 2xå og 2xø).
>
Smart, måske den bedste løsning, for at undgå fejl.
Jakob
| |
Michael Zedeler (19-12-2005)
| Kommentar Fra : Michael Zedeler |
Dato : 19-12-05 22:31 |
|
Jakob Munck wrote:
> "Rune N." <mr_crimp@gmail.dom> skrev i en meddelelse
> news:pan.2005.12.19.11.53.54.378004@gmail.dom...
>
>>Jeg ved godt at det ikke vil fange alle danske ord men hvad med blot at
>>søge efter æåø? Det fanger nok de fleste dansksproget indlæg. (Jeg har
>>i dette indlæg brugt 4xæ , 2xå og 2xø).
>
> Smart, måske den bedste løsning, for at undgå fejl.
Hvad med denne her:
Søren skriver indlægget: "How do I make the gargleblaster work?"
Kevin svarer: "Just press the red button, Søren."
Mvh. Michael.
--
Which is more dangerous? TV guided missiles or TV guided families?
Visit my home page at http://michael.zedeler.dk/
Get my vcard at http://michael.zedeler.dk/vcard.vcf
| |
Jakob Munck (20-12-2005)
| Kommentar Fra : Jakob Munck |
Dato : 20-12-05 09:20 |
|
> Søren skriver indlægget: "How do I make the gargleblaster work?"
> Kevin svarer: "Just press the red button, Søren."
>
Ja, den ville gå galt. Men dit eksempel forudsætter at Kevin har adgang til
et dansk tastatur og styresystem, og det er jo ret usandsynligt, hvis han
bor ude i verden. Mere sandsynligt ville han skrive "Soeren", og den er jo
god nok.
v.h.
Jakob
| |
Geert Lund (20-12-2005)
| Kommentar Fra : Geert Lund |
Dato : 20-12-05 16:46 |
|
Jakob Munck wrote:
> Ja, den ville gå galt. Men dit eksempel forudsætter at Kevin har adgang til
> et dansk tastatur og styresystem, og det er jo ret usandsynligt, hvis han
> bor ude i verden. Mere sandsynligt ville han skrive "Soeren", og den er jo
> god nok.
Hvordan bliver det usandsynligt at brugeren er dansk og har adgang til
at skrive æ, ø og å hvis han skal svare på et indlæg fra en anden dansk
bruger?
--
Med venlig hilsen
Geert Lund,
www.GLD.dk
| |
Bruno Christensen (21-12-2005)
| Kommentar Fra : Bruno Christensen |
Dato : 21-12-05 07:33 |
|
On Mon, 19 Dec 2005 22:31:05 +0100, Michael Zedeler wrote:
> Hvad med denne her:
>
> Søren skriver indlægget: "How do I make the gargleblaster work?"
You can take a look in "Encyclopædia Britannica".
--
Med Venlig Hilsen
Bruno Christensen
| |
|
|