WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   Numrera rader med regexp (https://www.wn.se/forum/showthread.php?t=25967)

Ungdebatt 2008-01-02 20:34

Hej.

Säg att jag har en text i databasen som ser ut på detta vis:

--------------------------------------------------------------
Jag heter Jeppe och jag kan äta en apelsin på
fem sekunder. Jag kan även dricka fem liter mjölk
på mindre än en halv sekund. Vad kan du göra?
--------------------------------------------------------------

Det jag vill göra är att när jag skriver ut texten på min sida så ska den med hjälp av regexp numrera raderna, ungefär såhär:

--------------------------------------------------------------
1. Jag heter Jeppe och jag kan äta en apelsin på
2. fem sekunder. Jag kan även dricka fem liter mjölk
3. på mindre än en halv sekund. Vad kan du göra?
--------------------------------------------------------------

Jag har testat mig fram på några vägar, men det gick inte så bra. Skulle ni kunna hjälpa med det problemet?

Tack på förhand.

Björklund 2008-01-02 21:25

En loop kanske?
Loopa igenom databasen och ändra ^ till värde X.

martine 2008-01-02 21:27

Vad har du för kriterier för radindelningen?

Ska varje rad var tio ord lång, ett visst antal bokstäver eller en viss optisk längd med ett bestämt typsnitt?

Du får nog precisera lite mer.

Lundmark 2008-01-02 21:53

....eller har varje rad en radbrytning (/n)?

Ungdebatt 2008-01-02 22:17

Jag har testat med följande kod, men mina RegExp kunskaper är tydligen inte tillräckliga. Jag har testat med att bryta ut \r \n och \s

Kod:

strText = "texten här som ska bearbetas"

With New RegExp
IgnoreCase = TRUE
.Global = TRUE
.Pattern = "(\n|\r|)"
Set objMatches = .Execute(strText)

strResult = ""
lngPos = 1

For Each objMatch In objMatches
 If objMatch.FirstIndex > lngPos Then
  strResult = strResult & Mid(strText, lngPos, objMatch.FirstIndex - lngPos + 1)
  inti = inti + 1
 End If

 strFound = inti & objMatch & "<br />"
 strResult = strResult & strFound
 lngPos = objMatch.FirstIndex + objMatch.Length + 1
Next
         
strNewText = strResult & Mid(strResult, lngPos)

End With

EDIT:
@martine
#1. Den ska reagera på radbrytning, vbcrlf, då skapar den en ny rad
#2. Den ska reagera på ifall en rad är längre än t.ex. 800 tecken, då gör den en ny rad.

eliasson 2008-01-03 23:50

Ptja, jag kan då inte ASP men med PHP så kan du alltid använda explode() på "\n" och sedan foreach'a det.

Ungdebatt 2008-01-05 23:22

eliasson, kan du vara snäll och visa ett kodexempel?

gsoc 2008-01-05 23:28

Kod:

$text = explode("\n", $filinnehall);
for($i = 0; $i < count($text); $i++){
echo "$i. Här gör vi nått med $text[$i]\n";
}


Ungdebatt 2008-01-06 00:25

Tack, jag kan ingen PHP, men jag får nog googla lite efter hjälp för att kunna "översätta" koden, det om ingen här kan hjälpa mig med det förståss.

Tack för hjälpen.

tartareandesire 2008-01-06 07:10

Den funktion i ASP som motsvarar PHP:s Explode heter Split.

Ungdebatt 2008-01-06 12:00

Jag prövade med denna kod:

Kod:

.Pattern = "[\n]"
         
Set objMatches = .Execute(strNewText)
         
For Each objMatch In objMatches
 iCount = iCount + 1
 strNewText = .Replace(strNewText,"<br />"&iCount&". ")
Next

...och det fungerar att skriva en siffra på varje rad, men ett fel uppstod och det är att iCount blir aldrig mer än 1. Det verkar som om jag inte lyckas räkna ut antalet rader eller så lyckas den bara räkna till en \n.

Så resultatet blir:

--------------------------------------------------------------
1. Jag heter Jeppe och jag kan äta en apelsin på
1. fem sekunder. Jag kan även dricka fem liter mjölk
1. på mindre än en halv sekund. Vad kan du göra?
--------------------------------------------------------------

EDIT: Jag vet att om man i detta fall skriver objMatches.Count så får man antalet \n som den hittade, men jag vill ju skriva det rad för rad, dvs 1, 2, 3..osv

HenSod 2008-01-06 14:25

Jag är inte jätteduktig på VB, men jag tycker att det borde se ut såhär:
Kod:

.Pattern = "[\n]"
 
Set objMatches = .Execute(strNewText)

iCount = 0

For Each objMatch In objMatches
 iCount = iCount + 1
 strNewText = .Replace(strNewText,"<br />"&iCount&". ")
Next


Ungdebatt 2008-01-06 14:29

HenSod, det är exakt samma kod, jag har redan gett iCount ett värde (1), men det hjälper inte.

Alex 2008-01-06 14:56

Detta kanske inte är så du vill lösa det, men lägg allt i en ordered list?
(
  1. lista
)

Då får du ju radnummer :)

Ungdebatt 2008-01-06 15:03

Det är helt sjukt vilken enkel lösning det var haha =) Tack.


Alla tider är GMT +2. Klockan är nu 22:07.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson