Jag hämtar en sträng med Request.Form från en textarea. Function RemoveLastBr(textVar) Det fungerade jättebra, fast det visste du kanske redan... ;) Function RemoveLastBr(textVar) Kan man inte använda VB:s inbyggda Replace()-funktion för att ersätta alla vbCrLf (eller vbCr och vbLf) med t ex ' ' eller '<br>' eller vad-man-nu-vill?! >Kan man inte använda VB:s inbyggda Replace()-funktion för att ersätta alla vbCrLf Man kan ju generalisera funktionen. Samt att flytta ut Left. Behövs ju bara göras en gång: Tack för kommentarer i koden, det är guld värt... Cr och Lf är endast en bokstav var, eller rättare sagt ett ASCII värde. vbCrLF är en text konstant som innehåller Cr och Lf. men om man nu vill kunna erbjuda sin kod till både windows och unix användare borde man kanske skriva om den lite för att kunna fånga upp enbart Lf(om nu unix enbart använder Lf, är inte insatt personligen)... någonting sånt här: *Ryser*<br>Oönskade radbrytningar
Hur kan jag få bort eventuella oönskade radbrytningar som användaren gjort i slutet på denna sträng?Sv: Oönskade radbrytningar
iLen = Len(textVar)
while mid(textVar, iLen - 1, 2) = vbCrlf
textVar = Left(textVar, iLen - 2)
iLen = iLen - 2
wend
RemoveLastBr = textVar
End Function
använd den såhär:
response.write "Utan sista enter" & RemoveLastBr(request.form("mintextarea"))Sv: Oönskade radbrytningar
Har ett par frågor till dock och det är vad som händer när dessa funktioner körs, jag tappar bort mej i while satsen...:
mid(textVar, iLen - 1, 2) = vbCrlf
Left(textVar, iLen - 2)
Tack för hjälpen förresten, det sa jag nog aldrig..!Sv: Oönskade radbrytningar
'Spara den aktuella längden på textsträngen
iLen = Len(textVar)
'Om dom två sista tecknena är Cr och Lf, avslutar alltid rader i pc, loopa
while mid(textVar, iLen - 1, 2) = vbCrlf
'Ta bort de två sista tecknena, dvs Cr och Lf
textVar = Left(textVar, iLen - 2)
'Minska längden på strängen med två tecken eftersom Cr och Lf är borttagna
iLen = iLen - 2
'Upprepa
wend
'Tilldela funktionen den bearbetade textvariabeln
RemoveLastBr = textVar
End Function
Som jag sa ovan avslutas rader med CrLf på pc, i unix är det Lf (kan vara värt att veta om även unix/linux användare använder ditt formulär)
Cr = ascii 13 och Lf = ascii 10.
Cr står för CarrigeReturn och betyder Markör Återvänd, dvs tillbaka till kolumn 1 på raden.
Lf står för LineFeed = radmatningSv: Oönskade radbrytningar
Är den funktionen så FÖRFÄRLIGT långsam eller vad?! (Har hört det nå'nstans men vet inte säkert...)
... bara en fundering...
// Qez :-)Sv: Oönskade radbrytningar
Visst kan man det, men här var frågan hur man tog bort alla avslutande radbrytningar och inte alla...
/JohanSv: Oönskade radbrytningar
<code>
Function RStringTrim(Value, Optional Chars = vbCrLf)
Dim lngPos
Dim lngCharsLen
lngCharsLen = Len(Chars)
lngPos = Len(textVar) - lngCharsLen + 1
Do While Mid(Value, lngPos, 2) = vbCrlf
lngPos = lngPos - lngCharsLen
Loop
RStringTrim = Left(Value, lngPos)
End Function
</code>Sv: Oönskade radbrytningar
Jag satt och kollade lite på icke skrivbara tecken i ASCII och har då en fråga till (surprise...)
Vilka av dessa kan man använda sig av i VB/ASP och hur?
Jag har liksom "tänkt" på ett formulär (html) som motsvarande ett .txt dokument.
Skulle jag exempelvis rent teoretiskt kunna läsa om en "Horizontal Tab" till en <blockquote>?
För att undvika missförstånd så är jag medveten om att jag hamnar i nästa fält om jag "tabbar" i ett formulär, men det finns ju de användare (och jag själv med för den delen) som hämtar text som är formaterad på annat ställe och kör copy&paste på denna.
I det fallet så följer ju "tabbarna" med in formuläret.
Vad jag oxå undrade över är hur strängen med vbCrLf ser ut?
Om jag skriver "Pelle" med en massa radmatningar på slutet... hur lagras detta?
När jag läser denna raden:
mid(textVar, iLen - 1, 2) = vbCrlf
Så "känns" det som att "Pelle" stängen skulle se ut:
strString = 'P' | 'e' | 'l' | 'l' | 'e' | 'v' | 'b' | 'C' | 'r' | 'l' | 'f'| osv...
Har därför lite problem med att förlika mej med tanken att att vbCrlf motsvarar 2 tecken.
Är jag lite lagom rörig? :)Sv: Oönskade radbrytningar
En sträng består ju egentligen av en massa ascii-värden så ditt exempel skulle ju bestå av asii-värdet för P (80) ...e(101), Cr (13), Lf (10)
/JohanSv: Oönskade radbrytningar
Cr är som jag sa en förkortning för CarrigeReturn, asciikoden är 13
Lf är en fortkortning för linefeed, asciikoden är 10.
så textsträngen i dittfall är |P|e|l|l|e|Cr|Lf|
Om man tittar på asciivärdena är det: |80|101|108|108|101|13|10|
är du med?Sv: Oönskade radbrytningar
<code>
Function CropLastCrLf(Value)
Dim lngPos
Dim lngCharsLen
lngPos = Len(textVar)
Do While ( (Mid(Value, lngPos, 1) = Chr(10)) or (Mid(Value, lngPos, 1) = Chr(13)) )
lngPos = lngPos - 1
Loop
CropLastCrLf = Left(Value, lngPos)
End Function
</code>
det blir något fler loopar, men å andra sidan blir kompabiliteten bättre...Sv: Oönskade radbrytningar
<br>
Skriv då istället:
<code>
Function CropLastCrLf(Value)
Dim lngPos
For lngPos = Len(Value) To 1 Step -1
Select Case Mid(Value, lngPos, 1)
Case vbCr, vbLf
Case Else
Exit For
End Select
Next
CropLastCrLf = Left(Value, lngPos)
End Function
</code>
Skillnader:<br>
* Använd inte funktionen chr() i onödan. Finns konstanter för 13, vbCr, och 10, vbLF.
* Att hämta tecknet två gånger är onödigt. Använd variabel eller Select Case.
* VB är dålig på optimering av utryck. De evaluerar = före OR. Så använd ElseIf.
* Men for satsen slapp jag undan några rader kod.