/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
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

Søg
Reklame
Statistik
Spørgsmål : 177501
Tips : 31968
Nyheder : 719565
Indlæg : 6408524
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste