Jag har en funktion med rekursivt anrop där den behöver köras väldigt många gånger innan allt "faller ut". Problemet är att vid vissa scenarion räcker inte stacken till. Det är en funktion som konverterar adresser i löptext till klickbara länkar. När en länk påträffats, anropar funktionen sig själv med resterande del av texten tills ingen mer påträffas. Detta låter mycket ineffektivt. Skicka upp koden hit kan jag hjälpa dig skriva om den. Använd Regular Expressions istället, går fortare och du behöver inte anropa flera funktioner... Följande borde träffa på alla länkar som börjar på "http://", "https://" och "www.". Det är fel sätt att använda rekursiva funktioner, helt enkelt. Okej, prövade din kod. Testa följande, borde träffa på enbart de länkar och emailadresser som inte har fixats till än... Hej igen! Okej, prövade men den klarar inte riktigt allt jag önskar :) Hej! Ok, ska ta en snabb fix, återkommer! Sådär, nu träffar den på allt du skickade åt mig... Korrigering... Suveränt! :-) Ok, nu borde det fungera =) Okej :) Sådär, nu ska det nog vara ordnat =) Problem är till för att lösas ;) Gällande target vore det fint om externa länkar kan styras till att bli _blank medan interna länkar som default använder sidstandarden och inte har nån angiven target. Om en länk däremot manuellt redigerats till att bryta det mönstret och har en annan target vore det trevligt om den ändå får förbli oförändrad. Jag ska ordna dina önskemål =) Hej! Enormt tack för hjälpen! Varsågod, det var en intressant utmaning bara =) Stötte på en länk som ger fel... Testa följande... Finemang! No problemos, här kommer koden för att stödja ftp adresser också! En småsak kanske, men den tar t.ex. ftp://ftp.en-url.com men inte när det enbart står ftp.en-url.com En sak till. Är ftp.en-url.com en giltlig "adress"? Bra fråga, men att utelämna ftp:// bör väl vara lika "korrekt" som att utelämna http:// på en webbsida... eller? :) Testade i Internet Explorer vad den sa och enligt den är det korrekt att skriva ftp.en-url.com så jag får väl lägga in stöd för det i funktionen ;) Hej igen! Tackar! Be på bara, är bara intressant att se vart funktionens "möjligheter" tar oss ;) Hittade exempel på en länk som inte går: Nu börjar det bli en hel del postningar här ;)Stackens storlek
Kan man ändra storleken på stacken?Sv: Stackens storlek
En text som är en slags länksamling med över ca 100 länkar visar sig nu bli för mycket för stacken...Sv: Stackens storlek
Sv: Stackens storlek
Vill du kan jag skriva ett mönster, eller gör en sökning på Google så hittar du nog en del exempel.
Mvh,
ThomasSv: Stackens storlek
Fler går att lägga till...
<code>
Private Function ActivateLinks(Text)
Dim RegExp
Dim Res
Set RegExp = New RegExp
RegExp.Pattern = "((?:https?://|www\.)[^\s]+)"
RegExp.Global = True
RegExp.IgnoreCase = True
Res = RegExp.Replace(Text, "$1")
Set RegExp = Nothing
ActivateLinks = Res
End Function
</code>
Borde fungera, har däremot inte testat den eftersom jag inte använder vanlig ASP nåmer; har gått över till ASP.NET...
Mvh,
ThomasSv: Stackens storlek
När du anropar funktionen så skickar du med en kopia av texten, det innebär ju att det finns hundra strängar i minnet innan sista anropet sker. Meddellängden på strängarna är hälften av hela originalsträngen, så anropen kräver alltså minne för längden av strängen * 0,5 * 100, och strängen lär väl vara ganska lång om den innehåller 100 länkar.
Om varje länk är 50 tecken så blir det 50 * 100 * 0,5 * 100 = 250.000 byte.
Inte konstigt att du får problem...Sv: Stackens storlek
Är själv inte så bra på RegExp hantering, så skulle du även kunna hjälpa mig så även följande då blir löst :)
Om din funktion stöter på en länk inne i strängen som redan är html-kodad till att vara klickbar så uppstår problem och sidan skrivs ut fel.
Utöver detta skulle jag även vilja att epost-adresser i texten blir klickbara samt samma hänsyn här till att om den redan är html-kodad till att vara klickbar behöver inget göras. T.ex. kanske en persons namn redan är html-kodad till att vara dennes klickbara epostadress.
Stort tack på förhand! :-)Sv: Stackens storlek
Säg till om du stöter på patrull!
<code>
Private Function ActivateLinks(Text)
Dim RegExp
Dim Res
Set RegExp = New RegExp
RegExp.Global = True
RegExp.IgnoreCase = True
'Ersätt länkar
RegExp.Pattern = "((?<!<a[\w\W]+?href="")(?:https?://|www\.)[^\s]+)"
Res = RegExp.Replace(Text, "$1")
'Ersätt e-post adresser
RegExp.Pattern = "((?<!<a[\w\W]+?href=""mailto:)[^\s]+@[^\s]+)"
Res = RegExp.Replace(Res, "$1")
Set RegExp = Nothing
ActivateLinks = Res
End Function
</code>
Mvh,
ThomasSv: Stackens storlek
Koden jag postade här före fungerar inte eftersom RegExp i VBScript inte har stöd för något som heter Lookbehind.
Här kommer en kod som jag har testat och den fungerar bra på det jag har testat...
<code>
Private Function ActivateLinks(Text)
Dim RegExp
Set RegExp = New RegExp
RegExp.Global = True
RegExp.IgnoreCase = True
'Radera redan länkade länkar
RegExp.Pattern = "<a[\w\W]+?href=""(?:mailto:)?([\w\W]+?)""[\w\W]*?>([\w\W]*?)</a>"
Text = RegExp.Replace(Text, " $1 |$2|")
'Fixa till www. länkar
RegExp.Pattern = "(^|\s)(www\.[^\s]+)"
Text = RegExp.Replace(Text, "$1http://$2")
'Ersätt länkar
RegExp.Pattern = "(^|\s)(https?://[^\s]+)"
Text = RegExp.Replace(Text, "$1$2")
'Ersätt e-post adresser
RegExp.Pattern = "(^|\s)([^\s""]+@[^\s]+)"
Text = RegExp.Replace(Text, "$1$2")
'Fixa till eventuella namn på länkar
RegExp.Pattern = "\1\s\|(.+?)\|"
Text = RegExp.Replace(Text, "$2")
Set RegExp = Nothing
ActivateLinks = Text
End Function
</code>
Den använder också Regular Expressions men det blir lite längre hantering eftersom Lookbehind inte stödjs...
Mvh,
ThomasSv: Stackens storlek
Testa att köra igenom denna textmassa i funktionen så ser du vad jag önskar den behöver kunna:
<code>texten= "olänkad epost: enepost@epost.com<br>"
texten= texten & "redan länkad epost: enepost@epost.com<br>"
texten= texten & "redan länkad epost 2: Sune Post<br>"
texten= texten & "olänkad weblänk: www.en-url.com<br>"
texten= texten & "redan länkad weblänk: www.en-url.com<br>"
texten= texten & "redan länkad weblänk 2: En hemsida<br>"
response.write "<p><b>Obehandlad text:</b><br>" & texten
response.write "<p><b>Bearbetad text:</b><br>" & ActivateLinks (texten)
</code>
Hoppas jag inte upplevs som för besvärlig nu bara :)Sv: Stackens storlek
Hittade ett litet fel, men här kommer koden som ordnar upp det också...
<code>
Private Function ActivateLinks(Text)
Dim RegExp
Set RegExp = New RegExp
RegExp.Global = True
RegExp.IgnoreCase = True
'Radera redan länkade länkar
RegExp.Pattern = "<a[\w\W]+?href=""(?:mailto:)?([\w\W]+?)""[\w\W]*?>([\w\W]*?)</a>"
Text = RegExp.Replace(Text, " $1 |$2|")
'Fixa till www. länkar
RegExp.Pattern = "(^|\s)(www\.[^\s]+)"
Text = RegExp.Replace(Text, "$1http://$2")
'Ersätt länkar
RegExp.Pattern = "(^|\s)(https?://[^\s]+)"
Text = RegExp.Replace(Text, "$1$2")
'Ersätt e-post adresser
RegExp.Pattern = "(^|\s)([^\s""]+@[^\s]+)"
Text = RegExp.Replace(Text, "$1$2")
'Fixa till eventuella namn på länkar
RegExp.Pattern = "\2\s\|(.+?)\|"
Text = RegExp.Replace(Text, "$3")
Set RegExp = Nothing
ActivateLinks = Text
End Function
</code>
Mvh,
ThomasSv: Stackens storlek
Och nejdå, du är inte jobbig på något sätt!
Bra att veta hur din text kan se ut nu, missade lite i tankegångarna tidigare ;)
Mvh,
ThomasSv: Stackens storlek
Återstår bara att se hur bra funktionen fungerar ihop med all text ;)
<code>
Private Function ActivateLinks(Text)
Dim RegExp
Set RegExp = New RegExp
RegExp.Global = True
RegExp.IgnoreCase = True
'Radera redan länkade länkar
RegExp.Pattern = "<a[\w\W]+?href=""(?:mailto:)?([\w\W]+?)""[\w\W]*?>([\w\W]*?)</a>"
Text = RegExp.Replace(Text, " $1 |$2|")
'Fixa till www. länkar
RegExp.Pattern = "(^|\s|>)(www\.[^\s]+)"
Text = RegExp.Replace(Text, "$1http://$2")
'Ersätt länkar
RegExp.Pattern = "(^|\s|>)(https?://[^\s<]+)"
Text = RegExp.Replace(Text, "$1$2")
'Ersätt e-post adresser
RegExp.Pattern = "(^|\s|>)([^\s""\|]+@[^\s<\|]+)"
Text = RegExp.Replace(Text, "$1$2")
'Fixa till eventuella namn på länkar
RegExp.Pattern = "\2\s\|(.+?)\|"
Text = RegExp.Replace(Text, "$3")
Set RegExp = Nothing
ActivateLinks = Text
End Function
</code>
Mvh,
ThomasSv: Stackens storlek
<code>
Private Function ActivateLinks(Text)
Dim RegExp
Set RegExp = New RegExp
RegExp.Global = True
RegExp.IgnoreCase = True
'Radera redan länkade länkar
RegExp.Pattern = "<a[\w\W]+?href=""(?:mailto:)?([\w\W]+?)""[\w\W]*?>([\w\W]*?)</a>"
Text = RegExp.Replace(Text, " $1 |$2|")
'Fixa till www. länkar
RegExp.Pattern = "(^|\s|>)(www\.[^\s<]+)"
Text = RegExp.Replace(Text, "$1http://$2")
'Ersätt länkar
RegExp.Pattern = "(^|\s|>)(https?://[^\s<]+)"
Text = RegExp.Replace(Text, "$1$2")
'Ersätt e-post adresser
RegExp.Pattern = "(^|\s|>)([^\s""\|>]+@[^\s<\|]+)"
Text = RegExp.Replace(Text, "$1$2")
'Fixa till eventuella namn på länkar
RegExp.Pattern = "\2\s\|(.+?)\|"
Text = RegExp.Replace(Text, "$3")
Set RegExp = Nothing
ActivateLinks = Text
End Function
</code>
Såg till att om det står till exempel <något>www.link.com</något> så fungerar funktionen...
Borde nog vara sista korrigeringen skulle jag tro, men säg till om du hittar mer =)
Mvh,
ThomasSv: Stackens storlek
En liten sak till. Ibland kan även lokala länkar i stil med dessa två finnas i textmassan:
En lokal länk
En lokal länk
Går det fixa så även de ignoreras?Sv: Stackens storlek
Har jag sagt många gånger ;)
<code>
Private Function ActivateLinks(Text)
Dim RegExp
Set RegExp = New RegExp
RegExp.Global = True
RegExp.IgnoreCase = True
'Radera redan länkade externa länkar
RegExp.Pattern = "<a[\w\W]+?href=""(?:mailto:|https?://)([\w\W]+?)""[\w\W]*?>([\w\W]*?)</a>"
Text = RegExp.Replace(Text, " $1 |$2|")
'Fixa till www. länkar
RegExp.Pattern = "(^|\s|>)(www\.[^\s<]+)"
Text = RegExp.Replace(Text, "$1http://$2")
'Ersätt länkar
RegExp.Pattern = "(^|\s|>)(https?://[^\s<]+)"
Text = RegExp.Replace(Text, "$1$2")
'Ersätt e-post adresser
RegExp.Pattern = "(^|\s|>)([^\s""\|>]+@[^\s<\|]+)"
Text = RegExp.Replace(Text, "$1$2")
'Fixa till eventuella namn på länkar
RegExp.Pattern = "\2\s\|(.+?)\|"
Text = RegExp.Replace(Text, "$3")
Set RegExp = Nothing
ActivateLinks = Text
End Function
</code>
Mvh,
ThomasSv: Stackens storlek
Dina lösningar har fungerat hela tiden, det är jag som ständigt kommer på mer och mer problem för dig hela tiden ;)Sv: Stackens storlek
Hittade nämligen en kombination som skulle skita sig totalt, nämligen om det stod eller liknande...
Däremot är det en liten sak, kan dina färdiga länkar se ut liknande det här: <a target="något" href="något">?
Det är nämligen så att mönstret nu förutsätter att de färdiga länkarna ser ut såhär:
Ska göra en lösning för det också, men testa om följande kod fungerar...
Private Function ActivateLinks(Text)
Dim RegExp
Set RegExp = New RegExp
RegExp.Global = True
RegExp.IgnoreCase = True
'Radera redan länkad e-post
RegExp.Pattern = "([\w\W]*?)"
Text = RegExp.Replace(Text, " $1 |$2|")
'Radera redan länkade externa länkar
RegExp.Pattern = "<a\shref=""(https?://[\w\W]+?)""[\w\W]*?>([\w\W]*?)</a>"
Text = RegExp.Replace(Text, " $1 |$2|")
'Fixa till www. länkar
RegExp.Pattern = "(^|\s|>)(www\.[^\s<]+)"
Text = RegExp.Replace(Text, "$1http://$2")
'Ersätt länkar
RegExp.Pattern = "(^|\s|>)(https?://[^\s<]+)"
Text = RegExp.Replace(Text, "$1$2")
'Ersätt e-post adresser
RegExp.Pattern = "(^|\s|>)([^\s""\|>]+@[^\s<\|]+)"
Text = RegExp.Replace(Text, "$1$2")
'Fixa till eventuella namn på länkar
RegExp.Pattern = "\2\s\|(.+?)\|"
Text = RegExp.Replace(Text, "$3")
Set RegExp = Nothing
ActivateLinks = Text
End Function
</code>
Mvh,
ThomasSv: Stackens storlek
En sak till, vill du att saker som "target="_blank" etc också ska komma med?
I så fall får jag skriva om koden lite till =)
Här har jag i alla fall ordnat föregående kod lite, nu klarar den även av om det står något annat element före href...
<code>
Private Function ActivateLinks(Text)
Dim RegExp
Set RegExp = New RegExp
RegExp.Global = True
RegExp.IgnoreCase = True
'Fixa till de färdiga länkarna
RegExp.Pattern = "<a\s([\w\W]*?)href=""([\w\W]+?)""([\w\W]*?)>([\w\W]*?)</a>"
Text = RegExp.Replace(Text, "$4")
'Radera redan länkad e-post
RegExp.Pattern = "<a\shref=""mailto:([\w\W]+?)""[\w\W]*?>([\w\W]*?)</a>"
Text = RegExp.Replace(Text, " $1 |$2|")
'Radera redan länkade externa länkar
RegExp.Pattern = "<a\shref=""(https?://[\w\W]+?)""[\w\W]*?>([\w\W]*?)</a>"
Text = RegExp.Replace(Text, " $1 |$2|")
'Fixa till www. länkar
RegExp.Pattern = "(^|\s|>)(www\.[^\s<]+)"
Text = RegExp.Replace(Text, "$1http://$2")
'Ersätt länkar
RegExp.Pattern = "(^|\s|>)(https?://[^\s<]+)"
Text = RegExp.Replace(Text, "$1$2")
'Ersätt e-post adresser
RegExp.Pattern = "(^|\s|>)([^\s""\|>]+@[^\s<\|]+)"
Text = RegExp.Replace(Text, "$1$2")
'Fixa till eventuella namn på länkar
RegExp.Pattern = "\2\s\|(.+?)\|"
Text = RegExp.Replace(Text, "$3")
Set RegExp = Nothing
ActivateLinks = Text
End Function
</code>
Mvh,
ThomasSv: Stackens storlek
En liten skönhetsdetalj också :)
Om en länk heter www.en-url.com så vore det snyggare om inte http:// skrivs ut i själva den klickbara texten.
Slutligen, släng gärna in kommentarer om att det är du som gjort funktionen i källkoden. Det känns bara rätt om credit går till dig.Sv: Stackens storlek
Ska slänga in någon kommentar att det är jag som gjort funktionen.
Ska också fixa den där skönhetsdetaljen ;)
Postar hit sen när den är klar...
Mvh,
ThomasSv: Stackens storlek
Nu tror jag att jag är klar med funktionen...
Försökte även fixa eventuella problem som skulle kunna uppstå beroende på vad de färdiga länkarna har för namn...
Fixade skönhetssaken och lade till kommentarer samt att man kan ställa in egenskaper för länkarna...
Om ingen target existerar och det är en extern länk ska den öppnas i ett nytt fönster...
<code>
Private Function ActivateLinks(Text)
'Funktionen skapad av Thomas Vanhaniemi (thomas@eurocitynet.nu)
'Skapad 18/6 2004
'All användning tillåten
Dim RegExp
Dim Spacer
Dim SpacerPattern
Set RegExp = New RegExp
Spacer = "-%|%-"
SpacerPattern = TextToPattern(Spacer)
RegExp.Global = True
RegExp.IgnoreCase = True
'Möblera om de färdiga länkarna
RegExp.Pattern = "<a([\w\W]*?)\s+href=""([\w\W]+?)""([\w\W]*?)\s*>([\w\W]*?)</a>"
Text = RegExp.Replace(Text, "$4")
'Radera redan länkad e-post
RegExp.Pattern = "<a\shref=""mailto:([\w\W]+?)""([\w\W]*?)\s*>([\w\W]*?)</a>"
Text = RegExp.Replace(Text, " $1 " & Spacer & "$2" & Spacer & "$3" & Spacer)
'Radera redan länkade externa länkar
RegExp.Pattern = "<a\shref=""(https?://[\w\W]+?)""([\w\W]*?)>([\w\W]*?)</a>"
Text = RegExp.Replace(Text, " $1 " & Spacer & "$2" & Spacer & "$3" & Spacer)
'Ersätt länkar
RegExp.Pattern = "(^|\s|>)(https?://[^\s<]+)"
Text = RegExp.Replace(Text, "$1$2")
'Ersätt www länkar
RegExp.Pattern = "(^|\s|>)(www\.[^\s<]+)"
Text = RegExp.Replace(Text, "$1$2")
'Ersätt e-post adresser
RegExp.Pattern = "(^|\s|>)([^\s""\|>]+@[^\s<\|]+)"
Text = RegExp.Replace(Text, "$1$2")
'Fixa till eventuella namn på länkar med target angett
RegExp.Pattern = "\2\s" & SpacerPattern & "(.{0,50}target="".*?"".{0,50})" & SpacerPattern & "(.{0,50})" & SpacerPattern
Text = RegExp.Replace(Text, "$4")
'Fixa till eventuella namn på länkar utan target angett
RegExp.Pattern = "\2\s" & SpacerPattern & "(.{0,50})" & SpacerPattern & "(.{0,50})" & SpacerPattern
Text = RegExp.Replace(Text, "$4")
Set RegExp = Nothing
ActivateLinks = Text
End Function
Function TextToPattern(Text)
'Funktionen skapad av Thomas Vanhaniemi (thomas@eurocitynet.nu)
'Skapad 18/6 2004
'All användning tillåten
Dim RegExp
Dim Res
Set RegExp = New RegExp
RegExp.Global = True
RegExp.IgnoreCase = True
RegExp.Pattern = "([\.\+\?\*\[\{\^\$\|\(\)\\])"
Res = RegExp.Replace(Text, "\$1")
Set RegExp = Nothing
TextToPattern = Res
End Function
</code>
Mvh,
ThomasSv: Stackens storlek
Kan jag maila dig om nån situation skulle uppstå som funktionen ej klarar? :)Sv: Stackens storlek
Det är bara att maila mig om något är fel =)
God fortsättning!
Mvh,
ThomasSv: Stackens storlek
Denna kod:
ÖLFA - Östergötlands Arkivförbund
Ger denna utdata på skärmen:
http://www.olfa.nu -%|%--%|%-ÖLFA - Östergötlands Arkivförbund-%|%-
Edit:
Såg själv felet nu... ett mellanslag smög sig in efter .nu :)
Kan du kanske även filtrera bort felaktiga mellanslag som hamnat inom href? :)Sv: Stackens storlek
Fixade problemet med mellanslag...
<code>
Private Function ActivateLinks(Text)
'Funktionen skapad av Thomas Vanhaniemi (thomas@eurocitynet.nu)
'Skapad 18/6 2004
'All användning tillåten
Dim RegExp
Dim Spacer
Dim SpacerPattern
Set RegExp = New RegExp
Spacer = "-%|%-"
SpacerPattern = TextToPattern(Spacer)
RegExp.Global = True
RegExp.IgnoreCase = True
'Möblera om de färdiga länkarna
RegExp.Pattern = "<a([\w\W]*?)\s+href=""\s*([^\s""]+)\s*""([\w\W]*?)\s*>([\w\W]*?)</a>"
Text = RegExp.Replace(Text, "$4")
'Radera redan länkad e-post
RegExp.Pattern = "<a\shref=""mailto:([\w\W]+?)""([\w\W]*?)\s*>([\w\W]*?)</a>"
Text = RegExp.Replace(Text, " $1 " & Spacer & "$2" & Spacer & "$3" & Spacer)
'Radera redan länkade externa länkar
RegExp.Pattern = "<a\shref=""(https?://[\w\W]+?)""([\w\W]*?)>([\w\W]*?)</a>"
Text = RegExp.Replace(Text, " $1 " & Spacer & "$2" & Spacer & "$3" & Spacer)
'Ersätt länkar
RegExp.Pattern = "(^|\s|>)(https?://[^\s<]+)"
Text = RegExp.Replace(Text, "$1$2")
'Ersätt www länkar
RegExp.Pattern = "(^|\s|>)(www\.[^\s<]+)"
Text = RegExp.Replace(Text, "$1$2")
'Ersätt e-post adresser
RegExp.Pattern = "(^|\s|>)([^\s""\|>]+@[^\s<\|]+)"
Text = RegExp.Replace(Text, "$1$2")
'Fixa till eventuella namn på länkar med target angett
RegExp.Pattern = "\2\s" & SpacerPattern & "(.{0,50}target="".*?"".{0,50})" & SpacerPattern & "(.{0,50})" & SpacerPattern
Text = RegExp.Replace(Text, "$4")
'Fixa till eventuella namn på länkar utan target angett
RegExp.Pattern = "\2\s" & SpacerPattern & "(.{0,50})" & SpacerPattern & "(.{0,50})" & SpacerPattern
Text = RegExp.Replace(Text, "$4")
Set RegExp = Nothing
ActivateLinks = Text
End Function
Function TextToPattern(Text)
'Funktionen skapad av Thomas Vanhaniemi (thomas@eurocitynet.nu)
'Skapad 18/6 2004
'All användning tillåten
Dim RegExp
Dim Res
Set RegExp = New RegExp
RegExp.Global = True
RegExp.IgnoreCase = True
RegExp.Pattern = "([\.\+\?\*\[\{\^\$\|\(\)\\])"
Res = RegExp.Replace(Text, "\$1")
Set RegExp = Nothing
TextToPattern = Res
End Function
</code>
Mvh,
ThomasSv: Stackens storlek
Just idag har jag inget behov av det, men om du bara för skojs skull känner för det att utöka funktionen, lägg gärna till att den även klarar ftp-adresser (default _blank även på dem).
:)Sv: Stackens storlek
<code>
Private Function ActivateLinks(Text)
'Funktionen skapad av Thomas Vanhaniemi (thomas@eurocitynet.nu)
'Skapad 18/6 2004
'All användning tillåten
Dim RegExp
Dim Spacer
Dim SpacerPattern
Set RegExp = New RegExp
Spacer = "-%|%-"
SpacerPattern = TextToPattern(Spacer)
RegExp.Global = True
RegExp.IgnoreCase = True
'Möblera om de färdiga länkarna
RegExp.Pattern = "<a([\w\W]*?)\s+href=""\s*([^\s""]+)\s*""([\w\W]*?)\s*>([\w\W]*?)</a>"
Text = RegExp.Replace(Text, "$4")
'Radera redan länkad e-post
RegExp.Pattern = "<a\shref=""mailto:([\w\W]+?)""([\w\W]*?)\s*>([\w\W]*?)</a>"
Text = RegExp.Replace(Text, " $1 " & Spacer & "$2" & Spacer & "$3" & Spacer)
'Radera redan länkade externa länkar
RegExp.Pattern = "<a\shref=""((?:https?://|ftps?://)[\w\W]+?)""([\w\W]*?)>([\w\W]*?)</a>"
Text = RegExp.Replace(Text, " $1 " & Spacer & "$2" & Spacer & "$3" & Spacer)
'Ersätt länkar
RegExp.Pattern = "(^|\s|>)((?:https?://|ftps?://)[^\s<]+)"
Text = RegExp.Replace(Text, "$1$2")
'Ersätt www länkar
RegExp.Pattern = "(^|\s|>)(www\.[^\s<]+)"
Text = RegExp.Replace(Text, "$1$2")
'Ersätt e-post adresser
RegExp.Pattern = "(^|\s|>)([^\s""\|>]+@[^\s<\|]+)"
Text = RegExp.Replace(Text, "$1$2")
'Fixa till eventuella namn på länkar med target angett
RegExp.Pattern = "\2\s" & SpacerPattern & "(.{0,50}target="".*?"".{0,50})" & SpacerPattern & "(.{0,50})" & SpacerPattern
Text = RegExp.Replace(Text, "$4")
'Fixa till eventuella namn på länkar utan target angett
RegExp.Pattern = "\2\s" & SpacerPattern & "(.{0,50})" & SpacerPattern & "(.{0,50})" & SpacerPattern
Text = RegExp.Replace(Text, "$4")
Set RegExp = Nothing
ActivateLinks = Text
End Function
Function TextToPattern(Text)
'Funktionen skapad av Thomas Vanhaniemi (thomas@eurocitynet.nu)
'Skapad 18/6 2004
'All användning tillåten
Dim RegExp
Dim Res
Set RegExp = New RegExp
RegExp.Global = True
RegExp.IgnoreCase = True
RegExp.Pattern = "([\.\+\?\*\[\{\^\$\|\(\)\\])"
Res = RegExp.Replace(Text, "\$1")
Set RegExp = Nothing
TextToPattern = Res
End Function
</code>
Mvh,
ThomasSv: Stackens storlek
:)Sv: Stackens storlek
Har en länk skrivits med blanksteg får den problem:
www.en-url.com/en mapp/index.htmlSv: Stackens storlek
Inga problem att lägga in det, men korrekt ska ju vara korrekt ;)
Mvh,
ThomasSv: Stackens storlek
Sv: Stackens storlek
Har för övrigt nyss gjort en funktion i VBScript som kontrollerar om en angiven e-post adress är i korrekt format =)
Du hittar den här om det är intressant: [Validera e-post adress]
Hoppas den fungerar bra, har ju inte haft möjlighet att testa den desstomer ;)
Mvh,
ThomasSv: Stackens storlek
Nu har jag modifierat koden så den klarar av mellanslag i länkar som är länkade samt ftp. och ftps. länkar...
<code>
Private Function ActivateLinks(Text)
'Funktionen skapad av Thomas Vanhaniemi (thomas@eurocitynet.nu)
'Skapad 20/6 2004
'All användning tillåten
Dim RegExp
Dim Spacer
Dim SpacerPattern
Set RegExp = New RegExp
Spacer = "-%|%-"
SpacerPattern = TextToPattern(Spacer)
RegExp.Global = True
RegExp.IgnoreCase = True
'Möblera om de färdiga länkarna
RegExp.Pattern = "<a([\w\W]*?)\s+href=\s*""\s*([^""]+?)\s*""([\w\W]*?)\s*>([\w\W]*?)</a>"
Text = RegExp.Replace(Text, "$4")
'Ersätt alla mellanslag med "%20" i alla existerande länkar
Dim Match, Matches
RegExp.Pattern = "<a\shref=""[^""\?]+"
Set Matches = RegExp.Execute(Text)
For Each Match In Matches
Text = Replace(Text, Match.Value, "<a " & Replace(Match.Value, " ", "%20", 4), 1, 1)
Next
'Radera redan länkad e-post
RegExp.Pattern = "<a\s+href=""mailto:([^""]+)""([\w\W]*?)\s*>([\w\W]*?)</a>"
Text = RegExp.Replace(Text, " $1 " & Spacer & "$2" & Spacer & "$3" & Spacer)
'Radera redan länkade externa länkar
RegExp.Pattern = "<a\s+href=""((?:https?://|ftps?://)[^""]+)""([^>]*)>([\w\W]*?)</a>"
Text = RegExp.Replace(Text, " $1 " & Spacer & "$2" & Spacer & "$3" & Spacer)
'Ersätt länkar
RegExp.Pattern = "(^|\s|>)(?:(https?)://|(ftp)s?://)([^\s<]+)"
Text = RegExp.Replace(Text, "$1$2$3://$4")
'Ersätt www länkar
RegExp.Pattern = "(^|\s|>)(www\.[^\s<]+)"
Text = RegExp.Replace(Text, "$1$2")
'Ersätt ftp länkar
RegExp.Pattern = "(^|\s|>)(ftps?\.[^\s<]+)"
Text = RegExp.Replace(Text, "$1$2")
'Ersätt e-post adresser
RegExp.Pattern = "(^|\s|>)([^\s""\|>]+@[^\s<\|]+)"
Text = RegExp.Replace(Text, "$1$2")
'Fixa till eventuella namn på länkar med target angett
RegExp.Pattern = "\2\s" & SpacerPattern & "(.{0,50}target="".*?"".{0,50})" & SpacerPattern & "(.{0,50})" & SpacerPattern
Text = RegExp.Replace(Text, "$4")
'Fixa till eventuella namn på länkar utan target angett
RegExp.Pattern = "\2\s" & SpacerPattern & "(.{0,50})" & SpacerPattern & "(.{0,50})" & SpacerPattern
Text = RegExp.Replace(Text, "$4")
Set RegExp = Nothing
ActivateLinks = Text
End Function
Function TextToPattern(Text)
'Funktionen skapad av Thomas Vanhaniemi (thomas@eurocitynet.nu)
'Skapad 20/6 2004
'All användning tillåten
Dim RegExp
Dim Res
Set RegExp = New RegExp
RegExp.Global = True
RegExp.IgnoreCase = True
RegExp.Pattern = "([\.\+\?\*\[\]\{\^\$\|\(\)\\])"
Res = RegExp.Replace(Text, "\$1")
RegExp.Pattern = "\n"
Res = RegExp.Replace(Res, "\n")
RegExp.Pattern = "\t"
Res = RegExp.Replace(Res, "\t")
RegExp.Pattern = "\r"
Res = RegExp.Replace(Res, "\r")
RegExp.Pattern = "\s"
Res = RegExp.Replace(Res, "\s")
Set RegExp = Nothing
TextToPattern = Res
End Function
</code>
Något mer? =)
Mvh,
ThomasSv: Stackens storlek
Inget mer jag stött på ännu, men nu törs jag nog snart inte be om mer heller... ;)Sv: Stackens storlek
Mvh,
ThomasSv: Stackens storlek
Mjölby kommuns industrihistoria - produkt & bild"
Verkar vara bindestrecket i länknamnet som orsakar det, för utan det går det.
Nåt du kan fixa? :)Sv: Stackens storlek
Här är koden för att fixa till problemet...
<code>
Function ActivateLinks(Text)
'Funktionen skapad av Thomas Vanhaniemi (thomas@eurocitynet.nu)
'Skapad 20/6 2004
'All användning tillåten
Dim RegExp
Dim Spacer
Dim SpacerPattern
Set RegExp = New RegExp
Spacer = "-%|%-"
SpacerPattern = TextToPattern(Spacer)
RegExp.Global = True
RegExp.IgnoreCase = True
'Möblera om de färdiga länkarna
RegExp.Pattern = "<a([\w\W]*?)\s+href=\s*""\s*([^""]+?)\s*""([\w\W]*?)\s*>([\w\W]*?)</a>"
Text = RegExp.Replace(Text, "$4")
'Ersätt alla mellanslag med "%20" i alla existerande länkar
Dim Match, Matches
RegExp.Pattern = "<a\shref=""[^""\?]+"
Set Matches = RegExp.Execute(Text)
For Each Match In Matches
Text = Replace(Text, Match.Value, "<a " & Replace(Match.Value, " ", "%20", 4), 1, 1)
Next
'Radera redan länkad e-post
RegExp.Pattern = "<a\s+href=""mailto:([^""]+)""([^>]*)>([\w\W]*?)</a>"
Text = RegExp.Replace(Text, vbCrLf & "$1 " & Spacer & "$2" & Spacer & "$3" & Spacer & vbCrLf)
'Radera redan länkade externa länkar
RegExp.Pattern = "<a\s+href=""((?:https?://|ftps?://)[^""]+)""([^>]*)>([\w\W]*?)</a>"
Text = RegExp.Replace(Text, vbCrLf & "$1 " & Spacer & "$2" & Spacer & "$3" & Spacer & vbCrLf)
'Ersätt länkar
RegExp.Pattern = "(^|\s|>)(?:(https?)://|(ftp)s?://)([^\s<]+)"
Text = RegExp.Replace(Text, "$1$2$3://$4")
'Ersätt www länkar
RegExp.Pattern = "(^|\s|>)(www\.[^\s<]+)"
Text = RegExp.Replace(Text, "$1$2")
'Ersätt ftp länkar
RegExp.Pattern = "(^|\s|>)(ftps?\.[^\s<]+)"
Text = RegExp.Replace(Text, "$1$2")
'Ersätt e-post adresser
RegExp.Pattern = "(^|\s|>)([^\s""\|>]+@[^\s<\|]+)"
Text = RegExp.Replace(Text, "$1$2")
'Fixa till eventuella namn på länkar med target angett
RegExp.Pattern = "(?:\r\n)\2\s" & SpacerPattern & "(.*?target="".*?"".*?)" & SpacerPattern & "(.*?)" & SpacerPattern & "(?:\r\n)"
Text = RegExp.Replace(Text, "$4")
'Fixa till eventuella namn på länkar utan target angett
RegExp.Pattern = "(?:\r\n)\2\s" & SpacerPattern & "(.*?)" & SpacerPattern & "(.*?)" & SpacerPattern & "(?:\r\n)"
Text = RegExp.Replace(Text, "$4")
Set RegExp = Nothing
ActivateLinks = Text
End Function
Function TextToPattern(Text)
'Funktionen skapad av Thomas Vanhaniemi (thomas@eurocitynet.nu)
'Skapad 20/6 2004
'All användning tillåten
Dim RegExp
Dim Res
Set RegExp = New RegExp
RegExp.Global = True
RegExp.IgnoreCase = True
RegExp.Pattern = "([\.\+\?\*\[\]\{\^\$\|\(\)\\])"
Res = RegExp.Replace(Text, "\$1")
RegExp.Pattern = "\n"
Res = RegExp.Replace(Res, "\n")
RegExp.Pattern = "\t"
Res = RegExp.Replace(Res, "\t")
RegExp.Pattern = "\r"
Res = RegExp.Replace(Res, "\r")
RegExp.Pattern = "\s"
Res = RegExp.Replace(Res, "\s")
Set RegExp = Nothing
TextToPattern = Res
End Function
</code>
Mvh,
Thomas