webForumDet fria alternativet

Hjälp med Regular Expression

8 svar · 339 visningar · startad av edebro

edebroMedlem sedan aug. 2001261 inlägg
#1

Jag har denna koden:

' funktionerna som ska fixa formateringen på texten och länkar
Function formatText(arg)
	Dim editText
				
	editText = Server.HTMLEncode(arg)
				
	If Len(editText) = 0 Then
		formatText = editText
		Exit Function
	End If
				
	Dim objRegExp
	Set objRegExp = New RegExp

	' länkarna, både www, [url]http://[/url] och e-mail länkar(@)
	Dim strBuf
	Dim objMatches, objMatch
	Dim Value, ReplaceValue, iStart, iEnd

	strBuf = ""
	iStart = 1
	iEnd = 1
			
	objRegExp.Pattern = "\b(www|[url]http://[/url]|[url]https://[/url]|[url]ftp://[/url]|\S+@)\S+\b"		' Sökmönster
	objRegExp.IgnoreCase = True											' Slå av Case Sensetive
	objRegExp.Global = True												' Så att den söker många gånger
	Set objMatches = objRegExp.Execute(editText)
	For Each objMatch in objMatches
		iEnd = objMatch.FirstIndex
		strBuf = strBuf & Mid(editText, iStart, iEnd-iStart+1)
		If InStr(1, objMatch.Value, "@") Then
		  strBuf = strBuf & GetHref(objMatch.Value, "EMAIL", "_blank")
		Else
		  strBuf = strBuf & GetHref(objMatch.Value, "WEB", "_blank")
		End If
		iStart = iEnd+objMatch.Length+1
	Next
	strBuf = strBuf & Mid(editText, iStart)
			
				
	formatText = strBuf
					
End Function

Function GetHref(url, urlType, Target)
	Dim strBuf

	If UCase(urlType) = "WEB" Then
		If LCase(Left(url, 3)) = "www" Then
			strBuf = "<A HREF='http://" & url & "' TARGET='" & Target & "'>" & url & "</A>"
		Else
			strBuf = "<A HREF='" & url & "' TARGET='" & Target & "'>" & url & "</A>"
        End If
	ElseIf UCase(urlType) = "EMAIL" Then
		strBuf = "<A HREF='mailto:" & url & "' TARGET='" & Target & "'>" & url & "</A>"
	End If
				  
	GetHref = strBuf

End Function

Som du säkert förstår så översätter den text till länkar i t ex ett forum.
För tillfället länkar den även en sån här länk:
"den här sidan är brahttp://www.server.com"

Jag vill altså att den endast ska länka om tecknet före själva sökmöstret är ett radbryt eller mellanslag

Så här ser ju sökmönstret ut just nu:
objRegExp.Pattern = "\b(www|http://|https://|ftp://|\S+@)\S+\b"

Den som löser detta får 100 kr. Det lovar och svär jag på.

Oerhört tacksam för svar (jag har hållit på mer eller mindre med detta problem i några månader) :/

edebroMedlem sedan aug. 2001261 inlägg
#2

Jag ser att ni på webForum har fått till detta på ett bra sätt. Någon administratör kanske kan bidra med sökmönstret som wF använder ;)

edebroMedlem sedan aug. 2001261 inlägg
#3

Nån?

PaceMedlem sedan juni 20019 024 inlägg
#4
(^|[^""])([url]http://[/url]|[url]https://[/url]|[url]ftp://[/url]|mailto:|file://|[url]telnet://[/url]|[url]gopher://[/url])([\w/#~:.,?+=&%@!\-]*?)([\s.:?\-]*[^\w/#~:.,?+=&%@!\-]|$)
edebroMedlem sedan aug. 2001261 inlägg
#5

Pace: Det vill inte fungera. Jag antar att du har kopierat detta sökmönster från något befintligt script och inte bara skrivit det rakt av (om du inte är en hejare på regexp dvs ;)). Har du något färdigt exempel på reguljära uttrycket i sin helhet?

PaceMedlem sedan juni 20019 024 inlägg
#6

Japp, det är kopierat & klistrat. När det redan fanns en färdig lösning fann jag ingen anledning att skapa en egen. ;)

Function ParseURLs(TextToParse)
	dim f_strText, m_objRxp, LinkTarget
	
	LinkTarget = "_blank"
	
	Set m_objRxp = New RegExp
	f_strText = TextToParse
	m_objRxp.Pattern="(^|[^""])([url]http://[/url]|[url]https://[/url]|[url]ftp://[/url]|mailto:|file://|[url]telnet://[/url]|[url]gopher://[/url])([\w/#~:.,?+=&%@!\-]*?)([\s.:?\-]*[^\w/#~:.,?+=&%@!\-]|$)"
	f_strText=m_objRxp.Replace(f_strText,"$1<a target=""" & LinkTarget & """ href=""$2$3"">$2$3</a>$4")
	m_objRxp.Pattern="(^|[^\w/>])(www\.[\w/#~:.,?+=&%@!\-]*?)([\s.:?\-]*[^\w/#~:.,?+=&%@!\-]|$)"
	f_strText=m_objRxp.Replace(f_strText,"$1<a target=""" & LinkTarget & """ href=""http://$2"">$2</a>$3")
	
	'objRxp.Pattern = "(\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+)"
	
	m_objRxp.Pattern="(^|[^:>\w])([\w\.]*@[\w\.\-]*\.\w{2,3})(\b|$)"
	f_strText=m_objRxp.Replace(f_strText,"$1<a href=""mailto:$2"">$2</a>")
	ParseURLs = f_strText
End Function

Tror den är från emissions wFparser.

edebroMedlem sedan aug. 2001261 inlägg
#7

Pace: tack som faan. Det ser ut att fungera skitbra. Och nu får jag det i en enda funktion också, ist för två som förut.

Skicka din adress till mikael@edebro.net så ska jag skicka din belöning. :birp

voigtann1Medlem sedan juni 20019 519 inlägg
#8

vårda ditt språk :)

edebroMedlem sedan aug. 2001261 inlägg
#9

Okej, jag förhastade mig lite. Den fungerade inte alls perfekt. Ta en titt på följande script som jag pillade ihop för att se om det fungerade:

<%
Function ParseURLs(TextToParse)
	dim f_strText, m_objRxp
	
	Set m_objRxp = New RegExp
	f_strText = TextToParse
	m_objRxp.Pattern="(^|[^""])([url]http://[/url]|[url]https://[/url]|[url]ftp://[/url]|mailto:|file://|[url]telnet://[/url]|[url]gopher://[/url])([\w/#~:.,?+=&%@!\-]*?)([\s.:?\-]*[^\w/#~:.,?+=&%@!\-]|$)"
	f_strText=m_objRxp.Replace(f_strText, "$1<a href=""$2$3"">$2$3</a>$4")
	m_objRxp.Pattern="(^|[^\w/>])(www\.[\w/#~:.,?+=&%@!\-]*?)([\s.:?\-]*[^\w/#~:.,?+=&%@!\-]|$)"
	f_strText=m_objRxp.Replace(f_strText, "$1<a href=""http://$2"">$2</a>$3")
	
	'objRxp.Pattern = "(\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+)"
	
	m_objRxp.Pattern="(^|[^:>\w])([\w\.]*@[\w\.\-]*\.\w{2,3})(\b|$)"
	f_strText=m_objRxp.Replace(f_strText, "$1<a href=""mailto:$2"">$2</a>")
	ParseURLs = f_strText
End Function
%>

<HTML>
<BODY>

<% If Len(Request.Form("message")) = 0 Then %>
	<FORM NAME="testLinks" ACTION="convertLinks.asp" METHOD="POST">
	<TEXTAREA NAME="message" COLS=100 ROWS=20></TEXTAREA><BR>
	<INPUT TYPE="submit">
	</FORM>
<% Else %>
	<%= ParseURLs(Request.Form("message")) %>
<% End If %>

</BODY>
</HTML>

Om ni inte orkar prova scriptet så kan jag meddela att den inte byter ut till länkar om man t ex har en sån här text:
"jag heter mikael, du kan maila till mig på mikael@edebro.net"

Den verkar bara länka om det är ett radbryt före själva länktexten.

Och eftersom jag inte kan regular expressions så bra så är det svårt att modifiera det där avancerade sökmönstret.

134 ms totalt · 3 externa anrop · v20260731065814-full.7de19299
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
132 ms — hämta tråd, inlägg och bilagor (db)