Avatar billede aerobee Nybegynder
29. august 2005 - 12:45 Der er 17 kommentarer og
1 løsning

Undgå flooding i textarea

Hejsa...

Hvordan kan jeg lave et check på at brugere ikke flooder et textarea? Forstået på den måde at f.eks

ggggggggggggggggggggggggggggggggg eller hhhhhhhhhhhhhhh eller sdgfasbkæbgfsædlfhasædf ikke accepteres?

textareaet må indeholde så meget tekst som brugeren har lyst til at skrive men der skal tjekkes på at de ikke bare skriver ggggggggggggggggggggggg osv..

Er det forståeligt?

Vil helst undgå at bruge javascript.
Avatar billede locturian Nybegynder
29. august 2005 - 13:05 #1
Du kan jo starte med at lave noget tjeck på de ord at folk skriver ind, og så melde fejl til brugeren, hvis et ord fx. er 20 bogstaver langt...

Du starter med at splitte teksten op...

arrText = Split(Request.Form("MitTextFelt"), " ")
For i = 0 to UBound(arrText)
If Len(arrText(i)) > 20 Then 'Her spørger vi om ordet er større end 20
Fejl = "Der er en fejl"
End If
Next

If Fejl = "" Then 'Gem din besked
'Gem besked her
Else
Response.Write "Dit ord er mere end 20 tegn langt"
End If

Du kan så bygge flere regler på, hvis du skulle ønske det...

Dette var bare et utroligt simpelt eksempel! :)
Avatar billede softspot Forsker
29. august 2005 - 13:07 #2
Det er vel svært at lave et check for dette uden at gå ind i en sproglig syntaktisk analyse af teksten, eller i det mindste holde teksten op mod en ordbog...

Hvis jeg alligevel skulle komme med et bud på hvordan du kunne gribde det an, ville det være noget med at:

1. checke om der forekommer ord med mere end 3 (eller 4 for den sags skyld) konsonanter efter hinanden

2. checke hvor stor en procentdel af teksten dette er et problem (det kunne jo være folk skriver *GGG* eller *SSSSSS* hvis det er forum-relateret tekst).

Du kunne lave en eller anden form for parser der kan løbe teksten igennem tegn for tegn og på den måde verificerer dine regler og holder status med hvormange ord der "falder igennem".
Avatar billede aerobee Nybegynder
29. august 2005 - 13:08 #3
Jeps den løsning der havde jeg også tænkt, men så kan brugeren jo bare skrive

ggggggggggg gggggggggggg gggggggggg

Kan man ikke gøre sådan at et bokstav maks må stå x antal gang i træk?

Eksempel..
Det er er tilladt
aaa
Men ikke det her
aaaa

Kan du se hvad jeg mener?
Avatar billede aerobee Nybegynder
29. august 2005 - 13:10 #4
Feks lave en regl der hedder at et bokstav må maks stå 4 gange i træk altså aaaa og hvis brugeren skrive aaaaa får de fejl
Avatar billede softspot Forsker
29. august 2005 - 15:18 #5
Hep der! Har lige flikket noget kode sammen som jeg tror fungere, men du kan jo få æren af at teste det ;)

Det drejer sig om en class som ligger i sin egen fil og en testside som viser hvordan man kan bruge den. Here goes:

analyze.cls.asp:
----------------

<%
class TextAnalyzer
    private m_text
    private m_maxConsecutiveConsonants
    private m_idx
    private m_countValidWords
    private m_countWords
    private m_strValidWordChars
    private m_strInvalidWords
   
    ' =============================================================================
    ' =============================================================================
    private sub Class_Initialize()
        m_text = ""
        m_maxConsecutiveConsonants = 3
        m_idx = 1
        m_countValidWords = 0
        m_countWords = 0
        m_strInvalidWords = ""
        m_strValidWordChars = "abcdefghijklmnopqrstuvwxyzæøåâãäáàôöõóòêëéèÿý0123456789-"
    end sub
   
    ' =============================================================================
    ' =============================================================================
    public property get maxConsecutiveConsonants
        maxConsecutiveConsonants = m_maxConsecutiveConsonants
    end property
   
    public property let maxConsecutiveConsonants(value)
        m_maxConsecutiveConsonants = value
    end property
   
    public property get Text
        Text = m_text
    end property
   
    public property let Text(value)
        m_text = value
        m_idx = 1
        m_countValidWords = 0
        m_countWords = 0
        m_strInvalidWords = ""
    end property
   
    public property get countWords
        countWords = m_countWords
    end property
   
    public property get countValidWords
        countValidWords = m_countValidWords
    end property
   
    public property get countInvalidWords
        countInvalidWords = m_countWords - m_countValidWords
    end property

    public property get invalidWords
        invalidWords = m_strInvalidWords
    end property
   
    ' =============================================================================
    ' =============================================================================
    private function isWordValid(wd)
        dim arrConsonants
        dim idx, consonant, vovels
        dim isValid
        isValid = true
        strConsonants = "bcdfghjklmnpqrstvwxz"
        idx = 1
        consonant = 0
        vovels = 0
        do while idx <= len(wd)
            if instr(1, strConsonants, mid(wd, idx, 1), vbTextCompare) > 0 then
                consonants = consonants + 1
                if consonants > maxConsecutiveConsonants then
                    isValid = false
                    exit do
                end if
            else
                consonants = 0
                vovels = vovels + 1
            end if
            idx = idx + 1
        loop
       
        ' hvis der ikke fandtes mere end det tilladte efterfølgende
        ' antal konsonanter og der er mindst en vokal i ordet
        ' så er det OK (undgår ord som khj, kls, jh osv.
        isWordValid = isValid and (vovels > 0)
    end function
   
    ' =============================================================================
    ' =============================================================================
    private sub findNextWordStart()
        'response.Write("findNextWordStart - Enter (" & m_idx & ")<br>")
        ' textLen er en optimering, så vi undgår at kalde len på text hvert gennemløb
        dim textLen
        textLen = len(m_text)
       
        ' Sålænge den aktuelle karakter ikke er i strengen med
        ' valide karakterer for ord, så forøges indekset
        do while (instr(1, m_strValidWordChars, mid(m_text, m_idx, 1), vbTextCompare) = 0) and (m_idx < textLen)
            m_idx = m_idx + 1
        loop
        'response.Write("findNextWordStart - Exit (" & m_idx & ")<br>")
    end sub
   
    ' =============================================================================
    ' =============================================================================
    private function getNextWord()
        'response.Write("getNextWord - Enter (" & m_idx & ")<br>")
        ' textLen er en optimering, så vi undgår at kalde len på text hvert gennemløb.
        ' newIdx benyttes til at finde slutningen af ordet. Det er vigtigt at m_idx IKKE
        ' ændres inden vi har kopieret ordet fra hovedteksten!
        dim textLen, newIdx
        textLen = len(m_text)
       
        ' Sæt pegepinden i starten af det aktuelle ord
        newIdx = m_idx
        ' Sålænge det aktuelle tegn er validt for ord, så flyttes pegepinden til
        ' slutnigen af ordet en position frem.
        do while instr(1, m_strValidWordChars, mid(m_text, newIdx, 1), vbTextCompare) > 0 and newIdx < textLen
            newIdx = newIdx + 1
        loop
       
        ' Hvis der blev fundet et ord, så kopier det ellers returner en tom streng
        if newIdx - m_idx > 0 then
            getNextWord = mid(m_text, m_idx, newIdx - m_idx)
        else
            getNextWord = ""
        end if
       
        ' Nu er det sikkert at ændre m_idx, så den er up to date med den aktuelle position.
        m_idx = newIdx
        'response.Write("getNextWord - Exit (" & m_idx & ")<br>")
    end function
   
    ' =============================================================================
    ' =============================================================================
    public function validateText()
        dim foundWord
        ' Nulstil objektets variable så der ikke opstår akkumulerede værdier
        ' ved gentagne kald af dette objekt.
        m_idx = 1
        m_strInvalidWords = ""
        m_countValidWords = 0
        m_countWords = 0
       
        ' Flyt markøren frem til det første ord i listen
        findNextWordStart
        ' Hent det første ord i teksten
        foundWord = getNextWord()
        ' Flyt markøren frem til det næste ord i listen
        findNextWordStart
        do while len(foundWord) > 0
            m_countWords = m_countWords + 1
            if isWordValid(foundWord) then
                ' tæl antallet af gyldige ord op
                m_countValidWords = m_countValidWords + 1
            else
                ' indsæt det ugyldige ord i strengen med ugyldige ord
                if len(m_strInvalidWords) > 0 then
                    m_strInvalidWords = m_strInvalidWords & ","
                end if
                m_strInvalidWords = m_strInvalidWords  & foundWord
            end if
           
            ' Hent det næste ord i teksten
            foundWord = getNextWord()
            findNextWordStart
        loop
    end function
end class
%>


testanalyse.asp:
----------------

<%@ language="vbscript" codepage="1252" %>
<!-- #include file="analyze.cls.asp" -->
<%
if request.Form("checkText") <> "" then
    set objAnalyze = new TextAnalyzer
    objAnalyze.Text = cstr(Request.Form("txtAnalyzeThis"))
    objAnalyze.validateText()
end if
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <title>Textanalyzer</title>
    <meta http-equiv="Content-type" content="text/html; charset=iso-8859-1" />
</head>
<body>

<form method="post">
    <textarea name="txtAnalyzeThis" style="width:600px;height:400px;"><%=Request.Form("txtAnalyzeThis")%></textarea><br>
    <input type="submit" name="checkText" value="Check it!">
</form>

<%
if not isEmpty(objAnalyze) then
    response.Write("Antal ord: " & objAnalyze.countWords & "<br>")
    response.Write("Antal gyldige ord: " & objAnalyze.countValidWords & "<br>")
    response.Write("Antal ugyldige ord: " & objAnalyze.countInvalidWords & "<br>")
    response.Write("Ugyldige ord: " & objAnalyze.invalidWords & "<br>")
end if
%>

</body>
</html>


Spørg til hvis der er noget du er i tvivl om :)
Avatar billede aerobee Nybegynder
29. august 2005 - 16:40 #6
Det må jeg sige softspot...
Du kan dit kram, det ser rigtig fornuftigt ud..

Men så er det bare lige hvordan jeg integrerer det i den form jeg har kørende i create.asp - det er jo kun et field vi snakker om med navnet beskrivelse...

Nogle ideer?
Avatar billede aerobee Nybegynder
29. august 2005 - 16:45 #7
Og får lavet den berømte textfejl = 1 and showform = 1 (ligesom fra forrige spørgsmål)
Avatar billede softspot Forsker
29. august 2005 - 16:59 #8
Prøv at smide mig den asp-fil du gerne vil have kode ind i, så kan jeg muligvis hjælpe dig :)
Avatar billede aerobee Nybegynder
29. august 2005 - 17:03 #9
har du ikke eventuelt en msn jeg kan smide den efter dig på ?
Så får du kode stillet ordentlig op i stedet for det rod der kommer ud af det herinde...
Og hvis det ikke er for besværligt for dig, og hvis du har tid vil jeg hellere at du forklarer det for mig - det lærer jeg mere ved :)
Avatar billede aerobee Nybegynder
29. august 2005 - 17:05 #10
MSN Messenger mener jeg.. Så får du kode så du selv kan se den og så "guide" mig igennem hvis du lyster og har tid.. Lærer jeg meget mere ved :P
Avatar billede softspot Forsker
29. august 2005 - 17:06 #11
twiceman på hotmail.com, men hvis det er ok med dig så vil jeg gerne vente til til senere... og du må gerne paste koden herind alligevel (jeg synes formatteringen plejer at rette sig op igen når man kopierer det ind i Visual Studio :))...
Avatar billede aerobee Nybegynder
29. august 2005 - 17:07 #12
kan jeg tilføje dig på msn messenger på den mail du angav? Ja vente til senere er helt ok
Avatar billede softspot Forsker
29. august 2005 - 17:07 #13
men vi kan som sagt godt tage messenger senere... evt. hvis jeg finder en løsning på den.
Avatar billede softspot Forsker
29. august 2005 - 17:07 #14
ja, det gør du bare (accepterer nok ikke lige nu, men senere på aftenen).
Avatar billede aerobee Nybegynder
29. august 2005 - 17:09 #15
Har tilføjet dig på msn - håber det er ok...
Men du skal helt sikkert have point for den kode du pastede der..

Sååååå smid et svar ;)
Avatar billede softspot Forsker
29. august 2005 - 18:05 #16
OK :)
Avatar billede softspot Forsker
29. august 2005 - 18:20 #17
Takker for point :)
Avatar billede aerobee Nybegynder
29. august 2005 - 18:24 #18
no problem :P
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
Kurser inden for grundlæggende programmering

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