Function Shorter(strText, antal)
Dim arrText, counter, newText
arrText = Split(strText, " ")
For counter = 0 To uBound(arrText)
If Len(arrText(counter)) > antal then
If newText <> "" then
newText = newText & " " & Left(arrText(counter), antal) & " " & Right(arrText(counter), Len(arrText(counter))-antal)
Else
newText = Left(arrText(counter), antal) & " " & Right(arrText(counter), Len(arrText(counter))-antal)
End If
Else
If newText <> "" then
newText = newText & " " & arrText(counter)
Else
newText = arrText(counter)
End If
End If
Next
Shorter = newText
End Function
Response.write Shorter(strText,50)
Denna funktion har jag (troligen) hittat här på wF, men har nu upptäckt ett fel med den. Om strText är längre än 100 tecken så ska strängen ju delas upp i (minst) 3 delar. Det gör den inte. Den delas upp i 2 delar varav den första delen är 50 tecken lång, och den andra delen är resterande.
Hur gör jag så att funktionen fungerar även för strängar som ska delas mer än en gång? :)
Sitter på jobbet nu så jag vet inte om det fungerar men nått sånt här kanske?
Function SlitIt(TxtStr, n)
If Len(Trim(TxtStr)) <= n Then SlitIt = TxtStr: Exit Function
Dim i, TmpStr, OffSet: TxtStr = Trim(TxtStr)
For i = 0 To Len(TxtStr)
If Len(TxtStr) => n Then
If Mid(TxtStr, n, 1) = " " Then
SlitIt = ConCat(TxtStr)
Else
If InStr(TxtStr, " ") = False Then
TxtStr = Left(TxtStr, n) & " "
Else
TmpStr = Left(TxtStr, n)
OffSet = InStrRev(TmpStr, " ", n)
SlitIt = SlitIt & Left(TxtStr, Int(OffSet))
End If
End If
TxtStr = Right(TxtStr, (Int(Len(TxtStr)) - n)): i = (Int(Len(TxtStr)) - n)
Else
SlitIt = ConCat(TxtStr)
End If
Next
End Function
Function ConCat(TxtStr)
If TxtStr = "" Then Exit Function
ConCat = ConCat & TxtStr
End Function
Eftersom att jag sett så många konstiga lösningar så gkjorde jag två smarta regexp-lösningar. La in dem i script-arkivet. Men eftersom att tråden inte visas där än så postar jag det även här.
Här kommer två sätt för hur man kan hindra långa ord som tvingar fram sidscrollen. Gör dessa för att jag sett så väldigt många konstiga lösningar.
<%
Option Explicit
Function ShorterString1(ByVal sString, ByVal lMaxLength)
Dim objRegExp
Set objRegExp = New RegExp
objRegExp.Global = True
objRegExp.Pattern = "(\S{" & lMaxLength & "})"
ShorterString1 = objRegExp.Replace(sString, "$1 ")
Set objRegExp = Nothing
End Function
Response.Write ShorterString1("sdfsdfdssfdfvdgdgfsfggfgfgfgffgfdfgfggfdggfgfgfdgdffdfggffggfgfgfgfdfs lalalal eoeooeoe", 5) & "<br>"
Function ShorterString2(ByVal sString, ByVal lMaxLength)
Dim objRegExp
Set objRegExp = New RegExp
objRegExp.Global = True
objRegExp.Pattern = "(\S{" & lMaxLength & ",})"
ShorterString2 = objRegExp.Replace(sString, "<span style=""word-break: break-all;"">$1</span>")
Set objRegExp = Nothing
End Function
Response.Write ShorterString2("sdfsdfdssfdfvdgdgfsfggfgfgfgffgfdfgfggfdggfgfgfdgdffdfggffggfgfgfgfdfs lalalal eoeooeoe", 5)
%>
Den första sätter in mellanslag efter X antal tecken utan mellanslag. kan bli dubbla mellanslag om ordet är lika långt som maxlängden, men det bör inte spela någon roll eftersom att det inte visas som två mellanslag på en webbsida.
Den andra sätter in en span-tagg runt det långa ordet med CSS-attributet word-break: break-all;. Detta gör att det kommer att radbrytas när det behövs, men inga mellanslag visas. Lätt snyggaste lösningen, men lite trixig om man vill kombinera den med Server.HTMLEncode...