webForumDet fria alternativet

Problem med "bryta-lång-sträng"-funktion

ASP

8 svar · 751 visningar · startad av Peeer

Medlem sedan mars 20025 907 inlägg
Frågan#1
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? :)

Medlem sedan sep. 2000667 inlägg
#2

Detta undrar jag med.

Medlem sedan mars 20025 907 inlägg
#3
function ShortWord($text,$length) 
{
	$text = preg_replace ("/([^\s]{".$length.",})/e", "''.wordwrap('\\1', ".$length.", ' ', 1).''", $text);
	return $text;
}

/r Ähum, va inget :birp

Medlem sedan juni 200032 967 inlägg
#4

Peeer, du är medveten om att det här är ASP-forumet? ;)

Medlem sedan mars 20025 907 inlägg
#5

@nders skrev:

Peeer, du är medveten om att det här är ASP-forumet? ;)

Haha, dagens miss :D
Jag höll visst på med ASP för ett år sedan. :r :OO

Medlem sedan maj 2002560 inlägg
#6

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
Medlem sedan maj 200010 687 inlägg
#7

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...

Medlem sedan juni 200032 967 inlägg
#8

Snyggt, Erik!

Bokmärks. :)

Mvh

Medlem sedan mars 20023 686 inlägg
#9

Erik Juhlin skrev:

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.

<%

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>"

%>

Tack Erik för en ypperlig funktion! Precis vad jag letade efter!

266 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
124 ms — deklarationer (db)
0 ms — hämta statistik (cache)
136 ms — hämta tråd, inlägg och bilagor (db)
127 ms — ändringar (db)