webForumDet fria alternativet

plocka ut två saker ur en sträng

Webbutveckling

11 svar · 466 visningar · startad av Calevan

Medlem sedan maj 20031 173 inlägg
Frågan#1

Hej!

Har med hjälp av Request.Servervariables("HTTP_REFERER") i asp en av följande texter i en variabel

http:// www .google. se /search?hl=sv&q=Fredriks+fotosida&btnG=Google-s%C3%B6kning&meta=

http:// search.msn. se/results.aspx?FORM=MSNH&CP=1252&q=Fredriks+fotosida

http:// www .altavista. com/web/results?itag=ody&q=Fredriks+fotosida&kgs=1&kls=0

Nu vill jag dels plocka ut adressen och dels sökordet (det efter q=). Antar att man kan göra en regexp som matchar från "http://" tills nästa "/" och en som går från "q=" till "&". Tänker jag rätt, eller någon annan som har bra förslag?

Jag skulle behöva hjälp med att skriva detta, och gärna någon fin referens (helst på svenska) var man kan läsa mer om sånt här så jag kan lära mig det!

tack!

/red: la in lite mellanslag i länkarna så att de skulle bli text och inte länkar...

Medlem sedan dec. 20025 483 inlägg
#2

Hejsan!

Här är ett exempel:

dim arr
arr = array("http://www.google.se/search?hl=sv&q=Fredriks+fotosida&btnG=Google-s%C3%B6kning&meta=","http://search.msn.se/results.aspx?FORM=MSNH&CP=1252&q=Fredriks+fotosida","http://www.altavista.com/web/results?itag=ody&q=Fredriks+fotosida&kgs=1&kls=0")
dim re
set re = new regexp
re.pattern = "(https?://[^/]+)[^\?]+\?(?:[^q]|[^=]{2,}=[^&]*&)*q=([^&]+)"
re.ignorecase = true

for i = 0 to ubound(arr)
  set r = re.execute(arr(i))
  for each item in r
    for each item2 in item.submatches
      response.write item2 & "<br>"
    next
  next
next

set re = nothing

Någon bra referens på svenska vet jag tyvärr inte. :)

Medlem sedan maj 20031 173 inlägg
#3

Tack!

Verkar fungera bra, även om jag inte riktigt förstår hur. Har dock några frågor:

1. Får svaret "http://www.google.se" och skulle gärna vilja ha ett avslutande "/" tecken efter .se så det ser snyggt ut. förstår tyvärr inte var jag ska skriva in det.

2. om man söker med fnuttar runt sitt sökord så blir resultatet såhär:

%22Fredriks+fotosida%22

söksträngen: search?hl=sv&q=%22Fredriks+fotosida%22&btnG=Google-s%C3%B6kning&meta=

hur gör man så att det bara står Fredriks fotosida, utan fnuttar och utan plustecken?

tack!

(hittade lite info på webeye.nu, men tyvärr blev jag inte mycket klokare av det)

Medlem sedan dec. 20025 483 inlägg
#4

Du får ursäkta koden :r

dim arr
arr = array("http://www.google.se/search?hl=sv&q=%22Fredriks++fotosida%22&btnG=Google-s%C3%B6kning&meta=","http://www.google.se/search?hl=sv&q=Fredriks+fotosida&btnG=Google-s%C3%B6kning&meta=","http://search.msn.se/results.aspx?FORM=MSNH&CP=1252&q=Fredriks+fotosida","http://www.altavista.com/web/results?itag=ody&q=Fredriks+fotosida&kgs=1&kls=0")
dim re
set re = new regexp
re.pattern = "(https?://[^/]+/)[^\?]+\?(?:[^q]|[^=]{2,}=[^&]*&)*q=([^&]+)"
re.ignorecase = true

for i = 0 to ubound(arr)
  set r = re.execute(arr(i))
  for each item in r
    for each item2 in item.submatches
      dim re2
      set re2 = new regexp
      re2.global = true
      re2.pattern = "(^(%22)+)|((%22)+$)"
      item2 = re2.replace(item2, "")
      re2.pattern = "\+"
      item2 = re2.replace(item2, "&nbsp;")
      response.write item2 & "<br>"
      set re2 = nothing
    next
  next
next

set re = nothing
Medlem sedan maj 20031 173 inlägg
#5

det verkar fungera fint! ska göra några fler tester innan jag accepterar det helt som slutgiltligt! :)

vad i koden är det jag ska ursäkta dig för?

Medlem sedan dec. 20025 483 inlägg
#6

For-looparna och indenteringen skulle kunna göras snyggare. Sedan hade det inte varit fel med några radbrytningar här och där, för läsbarhetens skull. :)

Medlem sedan maj 20031 173 inlägg
#7

ok, men du tycker inte att din kod är ineffektiv eller?

nu är det ju så att svaret loopas ut hela tiden, om man vill ha in det i en databas så behöver man ju ha det i olika variabler först, dvs först vill jag sätta in sökmotorns namn i en variabel och sen sökordet i en annan. hur skulle man kunna få ut det på ett bra sätt med ovanstående kod? med item(0) och item(1) eller något sådant? och sen köra regexparna som är kvar på dem för att ersätta % och + tecken? då kanske item2 inte behövs eller tänker jag konstigt?

tack!

Medlem sedan dec. 20025 483 inlägg
#8

Jag har filat litet till på uttrycket och kommit fram till följande:

re.pattern = "(https?://[^/]+/)[^\?]+\?(?:[^q]|[^=]{2,}=[^&]*&)*q=(?:%22)?((?:[^&](?!%22&))*(?:.(?=%22))?)" 
re.ignorecase = true

for i = 0 to ubound(arr)
  set r = re.execute(arr(i))
  for each item in r
    searchengine = item.submatches(0)
    query        = item.submatches(1)

    set re2     = new regexp
    re2.global  = true
    re2.pattern = "\+"

    query = re2.replace(query, "&nbsp;")

    set re2 = nothing

    ' insert into foo values(searchengine, query)
  next
next
Medlem sedan maj 20031 173 inlägg
#9

tackar! funkar utmärkt!

Medlem sedan juli 2004206 inlägg
#10

Tilläggas bör att du kan köra en urldecode på url'en innan så slipper du alla %22, + (space) etc etc.

Medlem sedan dec. 20025 483 inlägg
#11

Finns det en sådan funktion i ASP/VBScript?

Medlem sedan mars 20032 667 inlägg
#12

Peter S skrev:

Finns det en sådan funktion i ASP/VBScript?

Så vitt jag vet så är svaret nej. :)

279 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
125 ms — deklarationer (db)
0 ms — hämta statistik (cache)
151 ms — hämta tråd, inlägg och bilagor (db)
119 ms — ändringar (db)