Forum > ASP > Generella frågor
Hej!
RegExp är något som verkligen inte är min starka sida så, jag har lite problem med hur jag ska lyckas bygga följande:
Jag har en textarea i ett formulär, i denna så läggs 3 länkar till, de ser ut t.ex. som:
Sommar - En härlig årstid
Vinter - Kallt och snöigt
Vår - Naturen vaknar igen
Det jag vill göra efter att jag skickat in detta i databasen är att när jag skriver ut detta igen vill jag ta bort <a href=""></a> länken som omger texten, samt dela texten i två delar, alltså Sommar sedan En härlig årstid. Dessutom vill jag göra så att en numrering läggs till på varje rad. Så slutresultatet jag vill ha när jag skriver ut är alltså:
ID# Ämne Titel
1 Sommar En härlig årstid
Hur ska jag gå tillväga för att lyckas med detta? Är som sagt riktigt dålig på RegExp.
| Skriv utVad innehåller textarean exakt? Vad vill du göra?
1. Du har en text som ser ut hur?
2. Vad skall ändras ifrån texten?
Är det en split på "-" du är ut efter, efter att du har tagit bort a-elementet?
1. Textarean är en helt vanlig sådan, vi kan för den delen helt bortse ifrån den, det är informationen i databasen jag vill förändra.
2. Texten i databasen kan för 1 och samma post t.ex. se ut som följande <a href="http://www.sidan.se">Sommar - En härlig årstid</a><a href="http://www.sidan.se">Vinter - Kallt och snöigt</a><a href="http://www.sidan.se">Vår - Naturen vaknar igen</a>
Det jag då vill göra är att först ta bort a-elementet helt från texten så att den istället blir Sommar En härlig årstid, efter det vill jag ställa upp texten i en numrerad lista, så att slutformateringen på texten blir som exemplet jag gjorde i min första post.
3. Jag antar det är vad jag vill, för jag vill om möjligt helt ta bort "-" och istället göra ett mellanrum på ett par hundra pixlar.
RegExp mönstret för a-elementen: <a[^>]*>([\s\S]*?)</a> och kör en replace med $1 för att ut det som står mellan a taggen. Kan Sommar och Vinter finnas med i samma text?
Menar du att de kan dyka upp i samma text? I sådana fall ja, och "Sommar" eller "Vinter" osv kan dessutom dyka upp flera gånger då det är ämnet i en post.
Ber om ursäkt, men jag förstår faktiskt noll av vad jag ska göra, som sagt den RegExp jag en gång kunde har jag sedan länge glömt av.
Jag måste vara trög, men vad är det du vill göra?
<a href="http://www.sidan.se">Sommar - En härlig årstid</a> <a href="http://www.sidan.se">Vinter - Kallt och snöigt</a> <a href="http://www.sidan.se">Vår - Naturen vaknar igen</a>
Sommar - En härlig årstid Vinter - Kallt och snöigt Vår - Naturen vaknar igen
Sen skall du göra något där? Är det alltid Sommar, Vinter, Vår och höst den kommer reagera på eller är det ett ORD framför "-" eller kan det vara meningar? Är det radbrytningar per "a-element" nu?
Dim myRegExp, ResultString
Set myRegExp = New RegExp
myRegExp.IgnoreCase = True
myRegExp.Global = True
myRegExp.Pattern = "<a[^>]*>([\s\S]*?)</a>"
ResultString = myRegExp.Replace(SubjectString, "$1")
Det är jätte många frågetecken för att man skall kunna ge dig ett mer korrekt svar.
Om det alltid är en struktur liknande att det är länkens text värde du vill ha:
<a href="....">hur är det</a> - Ett ord
ID# Ämne Titel
1 Sommar En härlig årstid
Okej jag ska försöka förtydliga det hela lite mera:
1. Man kommer in på en sida, en användare klistrar in en härva med länkar som kan se ut i princip hur som helst, det enda alla har gemensamt är <a href="länk">MENING HÄR - MENING HÄR</a> "<a href="länken">" vill jag ta bort, likaså "</a>".
2. Då har jag MENING HÄR - MENING HÄR kvar, då vill jag ta bort "-" samt lägga till kanske fem st. " " istället, så att Resultatet som skrivs ut blir MENING HÄR MENING HÄR.
3. Detta ska göras med alla länkar i inlägget, jag vill avsluta med att sätta alla i en numrerad lista så att slutresultatet blir:
#1 MENING HÄR MENING HÄR.
#2 MENING HÄR MENING HÄR.
#3 MENING HÄR MENING HÄR.
#24 MENING HÄR MENING HÄR.
OSV.
4. Strukturen kommer alltid från början när det postas från min textarea in i databasen att vara:
<a href="länken">ORD - ORD</a><a href="länken">ORD - ORD</a><a href="länken">ORD - ORD</a>
<a href="länken">ORD - ORD</a><a href="länken">ORD - ORD</a><a href="länken">ORD - ORD</a> Osv.
Hoppas det förklarar lite tydligare vad jag är ute efter! :)
Forfarande inte riktigt vad jag hade behövt för att ge ett korrekt svar, "Mening här" kan dessa innehålla "-" också? Det bli extremt mycket jobb för att försöka lista ut vad som är vad, men du få funktionen av den spec du har gett mig just nu:
<%
Function RenderLinkList(sValue)
Dim myRegExp, myMatches, myMatch
Set myRegExp = New RegExp
myRegExp.IgnoreCase = True
myRegExp.Global = True
myRegExp.Pattern = "<a[^>]*>([\s\S]*?-[\s\S]*?)</a>"
Set myMatches = myRegExp.Execute(sValue)
Set myRegExp = Nothing
dim i, splitValue, sReturnValue
For Each myMatch In myMatches
i = i + 1
splitValue = split(myMatch.SubMatches(0))
sReturnValue = sReturnValue & "#" & i & " " & splitValue(0) & " " & splitValue(1) & "<br />"
Next
Set myMatches = Nothing
RenderLinkList = sReturnValue
End Function
str =" <a href=""länk"">MENING HÄR - MENING HÄR</a> <a href=""länk"">MENING HÄR - MENING HÄR</a> <a href=""länk"">MENING HÄR - MENING HÄR</a>"
Response.Write RenderLinkList(str)
%>
Wow, tack voigtan för du lägger ned så mycket tid på detta! Funktionen är nästan som jag vill att den ska vara, dock är det ett litet problem till, det som skrivs ut nu ser exakt ut som jag vill ha det, förutom en liten detalj, en rad ser t.ex. ut som:
#1 MENING HÄR
Vilket innebär att den andra delen av länken inte kommer med, jag vill ha det som t.ex att den delar upp en boktitel, ber om ursäkt om jag vart otydlig med detta, så om det var en bok det handlade om hade det sett ut som <a href=""länk"">Jens Lapidus - Snabba Cash</a>. Försvinner en del då så, är det inte som det ska.
Problemet jag just insåg med detta själv är att en användare skulle ju kunna av misstag skriva Jens Lapidus - Snabba Cash - Pocket. Men kanske kan man göra så att bara det första "-" tecknet är det som RegExp:en reagerar på? För om själva titeln innehåller ännu ett "-" spelar ingen som helst roll, utan det är just att det "-" som är mellan Författare och Bok måste som funktionen ovan gör, skilja dem åt med ett mellanrum istället.
Kan man ens göra detta?
split() är ju felaktig såg jag nu, den spltar på mellanslag, inte "-":
splitValue = split(myMatch.SubMatches(0), "-")
skall det vara.
Nu börjar allting se riktigt bra ut! Fungerar som en klocka när länkarna var "<a href="länk">Text - Text</a> <a href="länk">Text - Text</a> <a href="länk">Text - Text</a>". Ett sista problem återstår dock som jag kom på i efterhand, det kommer egentligen se ut som följer: "<a href="länk">Text - Text</a><br /><a href="länk">Text - Text</a><br /><a href="länk">Text - Text</a>"
Alltså att det är "<br />" istället för bara ett mellanrum mellan länkarna, är detta något man kan fixa till?
Uppdatering:
Det var inte ens det som orsakade felet utan att "-" skrivs ut som "–"
kör en replace på <br /> innan du kör min funktion, eller så plockar du ju bara bort <br /> från min kod, jag tog det för givet när du skrev att du ville ha den som en lista så hade du inte gjort en radbrytning redan.
Detta kan hålla på i evighet utan att komma på en vettig lösning, det är därför det är extremt viktigt att när man få ett problem så ta man upp så många scenario som man kan som "fel" kan uppstå.
Vet inte om du hann se att jag redigerade mitt inlägg, men <br /> ska såklart vara med, jag som såg fel i källkoden ... det är att "-" skrivs ut som "–" som koden inte gillar, ska se om jag kan skriva om detta i editorn!
Antingen:
1. Replace på – => "-" och kör koden som den är
2. kör en split på "–" istället för "-"
Jag har försökt göra på sätt #2 redan, men det som händer då är - ingenting, en tom sida renderas, detta sättet hade ju krävt mindre kod, har du en aning om varför det inte fungerar?
Spelar ju egentligen ingen roll, så eftersom #2 inte fungerade körde jag en replace istället.
Blev jättebra det här voigtan och precis som jag ville ha det, återigen, stort tack för all hjälp!