webForumDet fria alternativet

Regular Expressions: citering i forum

ASP

20 svar · 778 visningar · startad av m_soderlund

Medlem sedan sep. 20026 425 inlägg
Frågan#1

Jag håller på med att utveckla ett forum som (förhoppningsvis) kommer upp på wF inom någon vecka. Nu är det så att forumet ska ha en citeringsfunktion, och den jag har nu vill inte riktigt fungera i alla lägen. Regular Expressions-koden ser ut så här:

Function FCode(str)

str = Replace(str,"<","&lt;")
str = Replace(str,VbCrLf,"<br />")

Set objRegExp = New regexp
objRegExp.Global = true
objRegExp.IgnoreCase = true

objRegExp.Pattern = "\[citat\]"
str = objRegExp.Replace(str,"<blockquote><span class=""cit"">Citat:</span><hr /><span class=""citat"">")

objRegExp.Pattern = "\[citat=(.*)\](.*|\s)\]"
str = objRegExp.Replace(str,"<blockquote>$1 skrev:<hr /><span class=""citat2"">$2]")

objRegExp.Pattern = "\[/citat\]"
str = objRegExp.Replace(str,"</span><hr /></blockquote>")

objRegExp.Pattern = "\[kod\]"
str = objRegExp.Replace(str,"<blockquote><span class=""kod"">Kod:<hr />")

objRegExp.Pattern = "\[/kod\]"
str = objRegExp.Replace(str,"<hr /></span></blockquote>")

objRegExp.Pattern = "\[(b|/b|i|/i|u|/u)\]"
str = objRegExp.Replace(str,"<$1>")

Set objRegExp = Nothing

Fcode = str
End Function

1. Om man enbart har två eller fler {citat}text{/citat} i texten fungerar det

2. Om man enbart har en {citat=namn}text{/citat} i texten fungerar det

3. Fungerar ej om det är blandat med {citat}text{/citat} och {citat=namn}text{/citat}, eller flera {citat=namn}text{/citat}

Så här blir det ifall om jag har två eller fler {citat=namn}text{/citat} i strängen som skrivs ut:

Magnus]Jag heter Magnus
<hr />
<br />
<br />

[citat=Martin skrev:
<hr />
Jag heter Martin
<hr />

Och själva texten som skrivs in ser ut så här:
{citat=Magnus}Jag heter Magnus{/citat}
{citat=Martin}Jag heter Martin{/citat}

OBS!! Byt ut { och } mot [ och ] i koden!!!

Mycket tacksam för hjälp, jag har sökt i forumet så mycket som möjligt men inte hittat svar på mitt problem.

Medlem sedan dec. 20003 887 inlägg
#2

Det här träffar flera [citat=]

objRegExp.Pattern = "\[citat=(.*)\](.*|\s)\[/citat\]"
str = objRegExp.Replace(str,"<blockquote>$1 skrev:<hr /><span class=""citat2"">$2</span><hr /></blockquote>")

Och det blir ju likadant för [citat]

objRegExp.Pattern = "\[citat\](.*|\s)\[/citat\]
str = objRegExp.Replace(str,"<blockquote><span class=""cit"">Citat:</span><hr /><span class=""citat"">$1<hr /></span></blockquote>")
"

Följande tar du bort

objRegExp.Pattern = "\[/citat\]"
str = objRegExp.Replace(str,"</span><hr /></blockquote>")

Jag vet inte hur det blir om du nästlar och/eller blandar hejvilt, men det är ju bara att testa ;)

Nu klippte och klistrade jag lite hipp som happ, så jag förbehåller mig eventuella konstigheter :)

Medlem sedan sep. 20026 425 inlägg
#3

Nä, det fungerar ändå inte. :( Koden ser ut så här:

objRegExp.Pattern = "\{citat=(.*)\](.*|\s)\[/citat\]"
str = objRegExp.Replace(str,"<blockquote>$1 skrev:<hr /><span class=""citat2"">$2</span><hr /></blockquote>")

objRegExp.Pattern = "\{citat\](.*|\s)\[/citat\]"
str = objRegExp.Replace(str,"<blockquote><span class=""cit"">Citat:</span><hr /><span class=""citat"">$1</span><hr /></blockquote>")

Problem som uppkommer:

{citat=Pelle}Pelle{/citat}
{citat=Martin}Martin{/citat} ger..

Pelle]Jag heter Pelle{/citat}
{citat=Martin skrev:
<hr />
Jag heter Martin
<hr />

{citat=Pelle}Pelle{/citat}
{citat}Martin{/citat} ger..

Pelle]Pelle{/citat}
{citat skrev:
<hr />
Martin
<hr />

Dessutom går det ej att använda två {citat}text{citat} i samma sträng. :(

OBS! Ersätt { och } med [ och ].

Medlem sedan dec. 20003 887 inlägg
#4
objRegExp.Pattern = "\[citat=(\w*)\](\w\s)*"
str = objRegExp.Replace(str,"<blockquote>$1 skrev:<hr /><span class=""citat2"">$2")

objRegExp.Pattern = "\[citat\](\w\s)*"
str = objRegExp.Replace(str,"<blockquote><span class=""cit"">Citat:</span><hr /><span class=""citat"">$1")

[blue]'Och tillbaka med...[/blue]
objRegExp.Pattern = "\[/citat\]"
str = objRegExp.Replace(str,"</span><hr /></blockquote>")

Ovan fungerade mot:
[citat=Hej]Hallå där din [citat=Hopp]nässelcitat[/citat] typ[/citat]Bla bla bla[citat=lingon]Slutcitat...

Bye![/citat] Klar...

Jag hoppas det fungerar för dig med :)

Medlem sedan sep. 20026 425 inlägg
#5

Engine^, du har precis tillsammans med @nders, fått plats under Speciellt tack till: i min readme.txt-fil som kommer med forumet. Tack, det fungerar jättebra!! Bevis. Tack!

Medlem sedan dec. 20003 887 inlägg
#6

Trevligt.

Kom just på att det finns ju ett problem med å, ä och ö ;)

objRegExp.Pattern = "\[citat=(\w*[åäö]*)\](\w\s)*"

det borde ta hand om sådana bekymmer.

Medlem sedan sep. 20026 425 inlägg
#7

För alla som inte riktigt hängde med, ser den färdiga funktionen ut så här:

<%
Function FCode(str)

str = Replace(str,"<","&lt;")
str = Replace(str,VbCrLf,"<br />")

Set objRegExp = New regexp
objRegExp.Global = true
objRegExp.IgnoreCase = true

objRegExp.Pattern = "\[citat=(\w*[åäö]*)\](\w\s)*"
str = objRegExp.Replace(str,"<blockquote>$1 skrev:<hr /><span class=""citat"">$2")

objRegExp.Pattern = "\[citat\](\w\s)*"
str = objRegExp.Replace(str,"<blockquote><span class=""cit"">Citat:</span><hr /><span class=""citat"">$1")

'Och tillbaka med...
objRegExp.Pattern = "\[/citat\]"
str = objRegExp.Replace(str,"</span><hr /></blockquote>")

objRegExp.Pattern = "\[kod\]"
str = objRegExp.Replace(str,"<blockquote><span class=""kod"">Kod:<hr />")

objRegExp.Pattern = "\[/kod\]"
str = objRegExp.Replace(str,"<hr /></span></blockquote>")

objRegExp.Pattern = "\[(b|/b|i|/i|u|/u)\]"
str = objRegExp.Replace(str,"<$1>")

Set objRegExp = Nothing

Fcode = str
End Function
%>

Funktionen anropar du sedan med Fcode(variabel).

Och slutligen: funktionen skriver dels ut Citat: citatet och exempelvis Engine^ skrev: citatet.

Medlem sedan juni 20019 519 inlägg
#8

fast det "dåliga" med denna kod är ju att man kan skriva

och aldrig avsluta den.. du kör inte tables eller något men tänk de som kommer använda koderna och vill ha <table> att om dom inte avsluta det blir det extremt fult..

Medlem sedan juni 200288 inlägg
#9

Ett annat problem som jag upptäckte var att det INTE fungerar att citera namn med mellanrum i, tex Kalle Anka.

Någon som har ngt förslag på hur det kan lösas?

Medlem sedan juni 20019 519 inlägg
#10

med ((.|\n)+?) så ska det fungera med mellanslag..

Medlem sedan juni 200288 inlägg
#11

Var exakt skall det placeras in i koden?

Medlem sedan juni 20019 519 inlägg
#12
objRegExp.Pattern = "\[citat=((.|\n)+?)\]((.|\n)+?)"
str = objRegExp.Replace(str,"<blockquote>$1 skrev:<hr /><span class=""citat"">$2")
Medlem sedan juni 200288 inlägg
#13

Hmmm... det fungerar dock inte smärtfritt.
Ett exempel på hur det blir:

Arne Anka skrev:
--------------------------------------------------------------------------------
nan även skriva ett svar.
--------------------------------------------------------------------------------

Jo, men fungerar det?
---------------------------------------------------------------------------------

Det fungerar dock med mellanrum i namnen, MEN den första bokstaven i varje meddelande verkar ersättas med ett N. Inte alls njutbart, särskilt inte när man citerar flera stycken, då blir nämligen [-taggen ersatt av ett nesligt N.

Hur gör man för att åtgärda detta lilla problem månne?

Medlem sedan sep. 20026 425 inlägg
#14

Min citering tror jag fungerar mer eller mindre perfekt, här kommer kod:

Function FCode(str)

str = Replace(str,"<","&lt;")
str = Replace(str,VbCrLf,"<br />")

Set objRE = New regexp
objRE.Global = true
objRE.IgnoreCase = true

'start citering
objRE.Pattern = "\[citat=(.*?)](\w\s)*"
str = objRE.Replace(str,"<br />[citat=$1]")

objRE.Pattern = "\[citat=(.*?)]"
str = objRE.Replace(str,"<blockquote><b>$1</b> skrev:<hr /><span class=""citat"">")

objRE.Pattern = "\[citat\](\w[åäö]*\s[åäö]*)*"
str = objRE.Replace(str,"<blockquote><br /><span class=""cit"">Citat:</span><hr /><span class=""citat"">$1")

objRE.Pattern = "\[/citat\]"
str = objRE.Replace(str,"</span><hr /></blockquote>")
'slut citering

'start kod
objRE.Pattern = "\[kod\]"
str = objRE.Replace(str,"<blockquote><span class=""kod"">Kod:<hr />")

objRE.Pattern = "\[/kod\]"
str = objRE.Replace(str,"<hr /></span></blockquote>")
'slut kod

objRE.Pattern = "\[(b|/b|i|/i|u|/u)\]"
str = objRE.Replace(str,"<$1>")

'fixa länkar och e-postadresser
objRE.Pattern = "([url]www.[/url][^ ]*[a-z])|([url]http://[/url][^ ]*[a-z])"
str = objRE.Replace(str,"<a href=""$1$2"" target=""_blank"">$1$2</a>")

'buggfixningar
str = Replace(str,"""www","""http://www")
str = Replace(str,"""http://www""","""www""")

str = Replace(str,"<br""","""")
str = Replace(str,"<br</a> />","</a><br />")

str = Replace(str,"</span><hr""","""")
str = Replace(str,"</span><hr</a> />","</a></span><hr />")

str = Replace(str,"<blockquote><span""","""")
str = Replace(str,"<blockquote><span</a>","</a><span")
str = Replace(str,"</b</a>>","</b>")
'slut

objRE.Pattern = "([\w~\-\.]+@[\w~\-\.]+[a-z])"
str = objRE.Replace(str,"<a href=""mailto:$1"">$1</a>")
'slut länkar och e-postadresser

Set objRE = Nothing

Fcode = str
End Function

Koden är den jag använder i mitt Dileno-forum (https://www.dileno.hel.nu/forum) så den är inte helt anpassad till ditt ändamål. :)

Medlem sedan aug. 2002207 inlägg
#15

m_soderlund: Din kod för taggarna b, i och u skulle du behöva se över lite snabbt. temp exekveras.

Medlem sedan sep. 20026 425 inlägg
#16

Tack Denniz! *w00ps*

Medlem sedan sep. 20026 425 inlägg
#17
objRE.Pattern = "\[(b|/b)|(i|/i)|(u|/u)\]"

borde väl fungera va? :D

/r - det gjorde det inte alls det. :( Måste jag dela upp i tre olika mönster?

Medlem sedan dec. 20003 887 inlägg
#18

Sedan skulle jag gissa på att i denna kod saknas det ett '\\'-tecken i dina två första citat-replace:ar

objRE.Pattern = "\[citat=(.*?)[b]\[/b]](\w\s)*"

objRE.Pattern = "\[citat=(.*?)[b]\[/b]]"
Medlem sedan sep. 20026 425 inlägg
#19

Njae, det hjälper ju inte att dela upp i tre mönster så klart. :(
Kan nån hjälpa mig? :D

Medlem sedan sep. 20026 425 inlägg
#20

Engine^ skrev:

Sedan skulle jag gissa på att i denna kod saknas det ett '\\'-tecken i dina två första citat-replace:ar

objRE.Pattern = "\[citat=(.*?)[b]\[/b]](\w\s)*"

objRE.Pattern = "\[citat=(.*?)[b]\[/b]]"

Min citering fungerar bra ändå..? Konstigt. Nä, nu får vi sluta rota i detta, så plockar jag upp denna tråd igen när det någon gång i framtiden blir dags att göra Dileno-forum v2 ;) .

259 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
125 ms — deklarationer (db)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)
124 ms — ändringar (db)