webForumDet fria alternativet

Vad heter koden jag letar efter??

ASP

5 svar · 461 visningar · startad av preben

Medlem sedan mars 2009452 inlägg
Frågan#1

Jag ska ha en liknande kod som denna:

IF NOT InStr("**", strText) THEN ...

Alltså, om strText INTE innehåller "**" då...

Men detta är fel. Man kan inte skriva så. Hur ska jag skriva!? Jag vet inte vad det är jag letar efter! Det kanske inte ens finns...!?

Medlem sedan dec. 20025 483 inlägg
#2
if instr(...) = 0 then
  ...
Medlem sedan mars 2009452 inlägg
#3

Nej... jag tror InstrRev möjligen kan fungera.

Jag ska kolla!!

Det är inte alltid det bara är två stjärnor. Ibland är det andra saker, saker jag inte kan rå över.

[redigera]
OK, ursäkta mig. Detta verkar fungera:

'myText = "** ökensand"
myText = "ökensand"

IF InstrRev(myText, "**") > 0 THEN response.write " ****************"

Medlem sedan dec. 20025 483 inlägg
#4

Alltså, i det här fallet spelar det ingen roll om du använder InStr eller InStrRev. Personligen skulle jag dock välja InStr och då skriva:

if InStr(strText, "**") = 0 then
  response.write "strText innehåller inte **"
else
  response.write "strText innehåller **"
end if
Medlem sedan aug. 20039 340 inlägg
#5

Jag kan försöka bringa lite insikt i vad som faktiskt händer under ytan.
Instr returnerar positionen till den första förekomsten av söksträngen i den strängen man söker i. Hittas inte söksträngen får man tillbaka 0 istället. Därför kan man skriva:

IF InStr("**", strText) THEN ...

...eftersom if tycker 0 är falskt och allt annat är sant.
Problemet kommer när du sätter in NOT. NOT funkar inte som man kanske tror, att det gör falskt till sant och sant till falskt. Istället inverterar NOT varje binär bit i talet. Det funkar visserligen för 0, som inverteras och blir -1 (Vilket motsvarar att alla bitar är satta i talet, t ex 11111111111111111111111111111111 i binärkod för ett 32-bitars tal)
Men om söksträngen däremot hittas precis i början, på första tecknet, får du tillbaka 1, eller i binärt, ...0001 (... = resten nollor) vilket inverteras och blir ...1110 (... = resten ettor denna gång) alltså -2.
Om strängen hittas på andra tecknet får du tillbaka 2, binärt ...0010 som inverteras och blir ...1101 vilket betyder -3.

Det enda sättet NOT x kan returnera 0 är om x innehåller inversen av 0, som är -1. Men Instr kan aldrig returnera -1, eller något negativt tal heller. Med andra ord, i koden...

IF NOT InStr("**", strText) THEN ...

kommer ... alltid att köras eftersom villkoret i IF alltid är sant.

InstrRev kommer inte hjälpa dig heller. Skillnaden mellan Instr och InstrRev är att InstrRev söker bakifrån, och returnerar den sista förekomsten av söksträngen istället för den första. Därmed kommer de två funktionerna returnera olika värden om strängen du söker i har två förekomster av söksträngen. Dock returnerar både 0 om söksträngen inte hittas alls.

Och lösningen är som Peter S pekade ut att jämföra resultatet från Instr med 0. Har du både kod som ska köras om söksträngen finns och om den inte finns kan du ju komma runt problemet genom att byta plats på kodkropparna för IF- och ELSE. Typ:

if InStr(strText, "**") then
  response.write "strText innehåller **"
else
  response.write "strText innehåller int **"
end if

... så slipper du använda = 0

För överigt... Din omskrivning

IF InstrRev(myText, "**") > 0 THEN response.write " ****************"

är helt ekvivalent med

IF InstrRev(myText, "**") THEN response.write " ****************"

Givet de värden som Instr kan spotta ur sig, blir hela uttrycket falsk om, och endast om, Instr returnerar 0, och i alla andra fall sant, alltså helt likvärdigt.

Medlem sedan mars 2009452 inlägg
#6

Tack!

Att min kod inte skulle fungera var ingen överraskning. Det kunde jag själv konstatera i ett annat sammanhang.

Däremot visste jag inte att InStrRev = reverse, baklänges...

Tack för ett tydligt inlägg!

277 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
136 ms — deklarationer (db)
0 ms — hämta statistik (cache)
138 ms — hämta tråd, inlägg och bilagor (db)
135 ms — ändringar (db)