[ASP] regelafbreken

Pagina: 1
Acties:

  • jvaneijk
  • Registratie: Mei 2003
  • Laatst online: 11-03 09:53
Ik heb een functie die breekt een string die maximaal 84 tekens is af
er mogen maximaal 3 regels tevoorschijn komen van elk 22 tekens.
dit los ik op door middel van de onderstaande functie

ASP.NET Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Function GetSpecialistTruncatedString(ByRef sStr, ByRef nCnt)

        Dim sRet
        Dim nRow
                
        If (Len(sStr) > nCnt) Then
            sRet = Left(sStr, 22)
            
            If (InStr(sStr, Space(1)) > 0) Then
                sRet = Left(sRet, InStrRev(sRet, Space(1)))
            End If          
            sRet = sRet & "<br>"
            
        
            sRet = sRet & Mid(sStr, InStrRev(sRet, Space(1)), 22)
            If (InStr(sStr, Space(1)) > 0) Then
                sRet = Left(sRet, InStrRev(sRet, Space(1)))
            End If          
            sRet = sRet & "<br>"
            
            sRet = sRet & Mid(sStr, InStrRev(sRet, Space(1)), 22)
            If (InStr(sStr, Space(1)) > 0) Then
                sRet = Left(sRet, InStrRev(sRet, Space(1)))
            End If          
            sRet = sRet & "<br>"    
                                                
                                                GetSpecialistTruncatedString = sRet
end fucntion


nu werkt die redelijk goed. maar gaat hij bij de 3e regel die hij naar buiten moet schrijven stuk..

Heeft iemand enig idee hoe dit kan?

iRacing Profiel


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

Je mist een End If ergens in je code, maar dat zal het probleem niet zijn.

Ik vind je functie sowieso een beetje brute-forcerig (nieuw woord :P). Waarom split je de string die je over 3 regels wil verdelen niet gewoon op de spatie, en dan ga je met een for each constructie door die array heen waarbij je steeds het volgende element aan een string toevoegt, en op het moment dat de string langer dan 84 tekens dreigt te worden plak je er een <br> tussen. Als je 3 <br>s afgedrukt hebt (tellertje bijhouden) dan spring je gewoon uit de loop en ben je klaar om je string te returnen.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • nIghtorius
  • Registratie: Juli 2002
  • Laatst online: 08-04 19:07

nIghtorius

Poef!

als je de resultaten echt zo wilt hebben (dus met smerige linebreaks)

code:
1
2
3
dit is een verha
al die zomaar wo
rdt afgebroken


moet je deze code eens proberen, uit m'n hoofd getypt (niet getest dus)

sStr = originele string
Columns = hoeveel tekens wanneer die moet afbreken. ijg 22 tekens
rows = hoeveel rijen voordat ie moet stoppen. ijg 3 regels.

ASP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function   getstringblock (ByRef sStr, byRef columns, ByRef rows)
    dim sResult
    dim nRow
    dim Cnt
    dim lCnt

    sResult = ""
    nRow = 0
    Cnt = 1
    lCnt = 0

    do
        sResult = sResult + Mid$ (sStr, Cnt, 1)
        lCnt = lCnt + 1
        if (lCnt = Columns) then
            sResult = sResult + "<br>"
            lCnt = 0
            nRow = nRow + 1
        end if
    loop until (Cnt>=Len(sStr)) or (nRow=rows)
    getStringBlock = sResult
end function


misschien dat je daar wat aan hebt.

[ Voor 45% gewijzigd door nIghtorius op 21-05-2004 17:43 ]

Ryzen 9 5900X @ 5.1Ghz | MPG B550 GAMING CARBON | 96GB DDR4-3200 | RTX 4070TI | 2TB + 1TB m.2 SSD | 3x 1TB HDD | 1x 2TB SATA SSD | 32" G3223Q (4K/144Hz)


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

NMe84 schreef op 21 mei 2004 @ 15:13:
Je mist een End If ergens in je code, maar dat zal het probleem niet zijn.

Ik vind je functie sowieso een beetje brute-forcerig (nieuw woord :P). Waarom split je de string die je over 3 regels wil verdelen niet gewoon op de spatie, en dan ga je met een for each constructie door die array heen waarbij je steeds het volgende element aan een string toevoegt, en op het moment dat de string langer dan 84 tekens dreigt te worden plak je er een <br> tussen. Als je 3 <br>s afgedrukt hebt (tellertje bijhouden) dan spring je gewoon uit de loop en ben je klaar om je string te returnen.
Toch maar een beetje code in mekaar plempen dan. :)

ASP.NET Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Public Function TruncString(Str, Tekens, Regels)
   Dim s, i, temp
   Dim Words, w

   s = ""
   i = 1
   temp = ""
   Words = Split(Str, " ")

   For Each w in Words
      If Len(temp & " " & w) > Tekens Then
         i = i + 1
         If i > Regels Then
            s = s & temp & "..."
            Exit For
         End If
         s = s & temp & "<br>"
         temp = w
      Else
         temp = temp & " " & w
      End If
   Next
   If Not i > Regels Then
      s = s & temp
   End If
End Function

Dit zou volgens mij (heb hem niet getest) elke string op elk aantal tekens, rekening houdend met de lengte van een woord, af moeten kappen. In jouw geval roep je de functie aan met de regel:
ASP.NET Visual Basic:
1
jouwstring = TruncString(jouwstring, 22, 3)

De enige bug die ik me bij deze functie kan bedenken is dat je helemaal geen output krijgt als er woorden in je string zitten die langer zijn dan het aantal tekens dat je aan de variabele Tekens meegeeft. Maarja, dat is toch een beetje je eigen verantwoordelijkheid dan. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • denyos
  • Registratie: Februari 2004
  • Laatst online: 23:06
Ik weet niet of dit valt onder een topic om hoog schoppen... maar aangezien ik probleempje heb met betrekking tot het afbreken van woorden dacht ik dat het het slimst was om het in dit topic te posten. Ik wil namelijk dat er in mijn chat scriptje geen extreem lange links / vingers die op een toets blijven hangen... op 1 regel wordt weergegeven. Dit trekt de lay-out nogal uit elkaar.
Nu kan ik dat natuurlijk voorkomen met css en vaste tabel maten maar dan verdwijnt het gedeelte van de text dat niet wordt weergegeven en dat is niet de bedoeling.
Word-Wrap:break-word heb ik ook mee lopen stoeien maar aangezien dat alleen door internet explorer wordt ondersteund ben ik daar niet bepaald fan van. Ook krijg ik dan het probleem dat er wel een scroll balk blijft (verticaal scrollen moet toegestaan blijven).

Mijn kennis van asp is nie bepaalt hoog en ondanks dat er overal tips worden gegeven ben ik nog niet tot een bruikbaar stukje script gekomen.

Ik heb tot nu toe het volgende stukje van nIghtorius een heel klein beetje aangepast maar helaas wilt dat niet werken (blijf in een loop hangen lijkt het op).

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<%
function   getstringblock (ByRef sStr, byRef columns)
    dim sResult
    dim Cnt
    dim lCnt

    sResult = ""
    Cnt = 1
    lCnt = 0

    do
        sResult = sResult + Mid (sStr, Cnt, 1)
        lCnt = lCnt + 1
        if (lCnt = Columns) then
            sResult = sResult + "<br>"
            lCnt = 0
           
        end if
    loop until (Cnt>=Len(sStr))
    getStringBlock = sResult
end function
%>

<%
BB=Request.form("Opinion")
BB=server.htmlencode(BB)
Output = getstringblock(BB,45)
Response.write Output
%>


edit: code tags fixed

[ Voor 4% gewijzigd door denyos op 20-01-2006 11:16 ]

Strava


  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
gebruik [code] [/code] tags, dat maakt het leesbaarder.

En volgens mij is dit de boosdoener: (regel 19 in je code dus :P )
loop until (Cnt>=Len(sStr))

dr moet nog een I of L voor Cnt.

Option Explicit bovenaan je pagina zetten en netjes alle variabelen die je gebruikt dmv Dim declareren. Dit zal je veel tijd met dit soort bugjes schelen.

[ Voor 37% gewijzigd door bigbeng op 20-01-2006 11:19 ]


  • denyos
  • Registratie: Februari 2004
  • Laatst online: 23:06
ten eerste bedankt voor de snelle reactie. Ik heb het gelijk uitgeprobeerd maar helaas doet dit nog niet precies wat ik had gehoopt.

Als ik nu een bericht type en ik druk op submit dan wordt de tekst veranderd in de eerste letter.
Schreef ik bijvoorbeeld een woord van 15 tekens wat begon met een a dan komt er 15 keer a te staan... Verder is het probleem dat wanneer hij de tekst hoort af te breken ( bij meer dan 45 tekens...) het script blijft loopen en een script timed out genereerd.

Edit: probleem met 15 keer teken 1 heb ik opgelost.
code:
1
2
3
4
5
6
7
8
9
 do
        sResult = sResult + Mid (sStr, Cnt, 1)
        lCnt = lCnt + 1
        Cnt = Cnt + 1
        if (lCnt = Columns) then
            sResult = sResult + "<br>"
            lCnt = 0
           
        end if


ik was vergeten Cnt mee te laten tellen dus iedere keer begon hij weer bij het eerste teken

Edit 2:

Het werkt! ik heb er het volgende van gemaakt:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function   getstringblock (ByRef sStr, byRef columns)
    dim sResult
    dim Cnt
    dim lCnt

    sResult = ""
    Cnt = 1
    lCnt = 0

    do
        sResult = sResult + Mid (sStr, Cnt, 1)
        lCnt = lCnt + 1
        Cnt = Cnt + 1
        if (lCnt = Columns) then
            sResult = sResult + "<br>"
            lCnt = 0
           
        end if
    loop until (Cnt>Len(sStr))
    getStringBlock = sResult
end function

[ Voor 56% gewijzigd door denyos op 20-01-2006 12:06 ]

Strava

Pagina: 1