webForumDet fria alternativet

Bugg i regExpo-objektet??

ASP

10 svar · 454 visningar · startad av mattiasjarnhall

Medlem sedan apr. 2001126 inlägg
Frågan#1

Hej alla!

Skrev tidigare om ett problem som sänkte min server (http://www.webforum.nu/showthread.php?s=&postid=560608#post560608) Nu är det så att jag lyckats "lokalisera" felet.. och det är mycket skumt.. mycket mycket skumt (tycker jag i alla fall!)

Om ni testar denna kod:

<%
' En länk som man skrivit felaktigt (Glömt ena hakparantesen i )
strText = "Lite text innan länken Text efter länken!Text efter länken! Text efter länken!Text efter länken! Text efter länken!Text efter länken! "

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

objRegExp.Pattern = "\((.|\s)*?)\[\/url\]"
strText = objRegExp.Replace(strText,"<A HREF=""$1"" TARGET=""_blank"">$2</A>")

Response.Write(strText)
%>

Så kommer det nog att funka, MEN det kommer ta tid.. och processorn kommer jobba på 100%..

Lägger man till ytterligare några "Text efter länken!" i slutet av strängen strText så kommer hela servern att hänga sig!

Byter jag mönster från: "\((.|\s)*?)\[\/url\]"
Till: "\((.|\s)?)\[\/url\]", så kommer det inte att vara några problem!

Nu till frågan! VARFÖR??? Varför blir det såhär? Är detta en bugg i RegExpo-objektet? Eller är det något annat som orsakar detta strul?

Själv tycker jag att objektet inte borde hitta en matchning på sin sökning och helt enkelt ge upp.. men istället så står den bara och "tuggar"

Snälla.. hjälp mig få en förklaring på detta! :)

Tack på förhand

/MJ

Medlem sedan dec. 20003 887 inlägg
#2

((.|\s)*?)

? : Matches the preceding character or subexpression zero or one time, or indicates a non-greedy quantifier.
* : Matches the preceding character or subexpression zero or more times.

Nu är jag långt ifrån en hejjare på regexp, men jag tycker kombinationen *? blir väldigt underlig. Själv skulle jag vilja ha ((.|\s)*), men det lär väl inte fungera. Det kan väl kanske vara så att *? kombinationen efter vissa former av subexpressions inte kan hanteras utan skapar skumma looper i tolken, vilket verkar vara fallet med ((.|\s)*?).

Jag testade ditt uttryck med Vides Regexptester och då gick det nästan bra... tog en jäkla tid båda varianterna. F'låt Vide om din server fick tugga regexp ett tag :e

Medlem sedan dec. 19998 577 inlägg
#3

Lugnt :e

Medlem sedan apr. 2001126 inlägg
#4

Visst går det segt.. testa att köra:

<%
' En länk som man skrivit felaktigt (Glömt ena hakparantesen i )
strText = "Lite text innan länken Text efter länken!Text efter länken! Text efter länken!Text efter länken! Text efter länken!Text efter länken! Text efter länken!Text efter länken! Text efter länken!Text efter länken! Text efter länken!Text efter länken! "

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

objRegExp.Pattern = "\((.|\s)*?)\[\/url\]"
strText = objRegExp.Replace(strText,"<A HREF=""$1"" TARGET=""_blank"">$2</A>")

Response.Write(strText)
%>

Så skall du se att allt hänger sig!

Ingen som kan komma med en bra förklaring på varför detta händer? Jag tycker det är en "livsfarlig" bugg.. alla som använder liknande mönster kan alltså få sina webbservrar sänkta bara för att man glömmer en hakparantes?!?!

/MJ

Medlem sedan juni 20022 599 inlägg
#5

Så skall du se att allt hänger sig!

Ja. Du hade onekligen rätt. Dllhost.exe skenar och lägger sig på 100% CPU.

Tyvärr är jag inte tillräckligt insatt i regexp för att kunna säga att det är en bugg, men när jag testar i VB så märkte jag att problemet uppstår när det finns för många blanktecken sammanlagt efter den sista hakparentesen (ca 25 st). Alla övriga tecken verkar gå bra. Kanske det är nån som får nån idé av detta?

På en skarp server är det så klart som du säger "livsfarligt". Antingen så får du försöka hitta ett annat pattern, eller så får du se till att exlicit kolla efter för många blankslag innan du skickar in det till Regexp.

Medlem sedan feb. 200311 inlägg
#6

Man ska vara väldigt noggrann när man skriver reguljära uttryck, det är mycket lätt att skapa uttryck som hamnar i väldigt djupa rekursioner och det är ? och * man ska vara försiktig med.

Medlem sedan jan. 20032 285 inlägg
#7

Jag vet inte så mycket om RegExp, men för mig verkar iaf det här patternet funka: "\(.*|\s*)\[\/url\]"
Men det kanske inte blir riktigt rätt med det som du ska göra?

Medlem sedan dec. 20003 887 inlägg
#8

Det verkar fungera alldeles utmärkt. Samt att den arbetade betydligt snabbare än *?-kombinationen.

Jag testade med:
"Här finns det en url-tagg: wF. Gå dit och lär dig en massa stuff ;) Kom igen kom igen kom igen!"

wF greppar min tagg... ;) |url=htp:/ww.webforum.nu|wF|/url|

Medlem sedan jan. 20032 285 inlägg
#9

Engine^: Vad var det som fungerade alldeles utmärkt? :l

Medlem sedan dec. 20003 887 inlägg
#10

Det pattern som du gav :)

Medlem sedan jan. 20032 285 inlägg
#11

Jasså du? :e Bra nyheter för mig då alltså! :)

267 ms totalt · 4 externa anrop · v20260731065814-full.2f471f9e
124 ms — deklarationer (db)
0 ms — hämta statistik (cache)
137 ms — hämta tråd, inlägg och bilagor (db)
127 ms — ändringar (db)