[js] Regex, Keyword uit Google url filteren

Pagina: 1
Acties:

  • pim
  • Registratie: Juli 2001
  • Laatst online: 22-05 23:05
Ik wil uit een google url, alles halen wat tussen q= en & staat.

code:
1
2
3
4
5
6
7
8
9
10
11
12
<script>
url = 'http://www.google.nl/search?q=keyword&ie=UTF-8&oe=UTF-8&hl=nl&lr=';

// (.+)  // 1 of meer tekens
// q=    // gevolgt door q=
// (.+)  // gevolgt door 1 of meer tekens, Het keyword waar het omgaat
// &     // gevolgd door het "& teken"
// (.*)  // Gevolgd door 0 of meer tekens..

k = url.replace(/(.+)q=(.+)&(.*)/, "$2");
document.write(k);
</script>

Geeft:

keyword&ie=UTF-8&oe=UTF-8&hl=nl

Hey probleem is dat hij naar het '&' teken zoekt vanaf het einde.. i.p.v. vanaf het begin..

Hij moet dus alleen "keyword" pakken i.p.v.:

http://www.google.nl/search?q=keyword&ie=UTF-8&oe=UTF-8&hl=nl&lr=

Iemand?

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 10-05 18:53

Bosmonster

*zucht*

makkelijker en betrouwbaarder: Haal alles uit de url na de eerste ?

Deze split je op & en alles wat overblijft split je op =. Zo krijg je een nette set van alle attributen, waaronder de q.

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Je probleem heeft te maken met het feit dat je regexp greedy is; dit zou ook gewoon moeten werken:
JavaScript:
1
var k = url.replace(/\?q=(.+?)&/, '$1');

Intentionally left blank


  • pim
  • Registratie: Juli 2001
  • Laatst online: 22-05 23:05
Dan duikt precies hetzelfde probleem op, als ik alles na het vraagteken wil pakken op deze manier:

code:
1
k = url.replace(/^(.+)\?(.+)/, "$2");

Zoekt hij naar het eerste vraagteken vanaf het einde, waardoor een string als deze:

http://www.google.nl/sear...word&ie=UTF-8&bla=bla?bla

Dit als uitkomst geeft:

?bla

i.p.v.:

?q=keyword&ie=UTF-8&bla=bla?bla

  • pim
  • Registratie: Juli 2001
  • Laatst online: 22-05 23:05
crisp schreef op 02 december 2003 @ 11:59:
Je probleem heeft te maken met het feit dat je regexp greedy is; dit zou ook gewoon moeten werken:
JavaScript:
1
var k = url.replace(/\?q=(.+?)&/, '$1');
Geeft als uitkomst:
http://www.google.nl/sear...=UTF-8&oe=UTF-8&hl=nl&lr=


Verder kan een google url er op verschillende manieren uitzien:

- http://www.google.nl/sear...=UTF-8&oe=UTF-8&hl=nl&lr=
- http://www.google.nl/search?hl=nl&q=keyword

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

pim schreef op 02 december 2003 @ 12:01:
Dan duikt precies hetzelfde probleem op, als ik alles na het vraagteken wil pakken op deze manier:

code:
1
k = url.replace(/^(.+)\?(.+)/, "$2");

Zoekt hij naar het eerste vraagteken vanaf het einde, waardoor een string als deze:

http://www.google.nl/sear...word&ie=UTF-8&bla=bla?bla

Dit als uitkomst geeft:

?bla

i.p.v.:

?q=keyword&ie=UTF-8&bla=bla?bla
omdat nog steeds je .+ greedy is (en overbodig ook) - alles vanaf de ? pakken doe je zo:
JavaScript:
1
var k = url.replace(/\?(.+)/, '$1');

je hoeft in je string niet vanaf het begin te matchen...

Intentionally left blank


  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

mmmz, ik maak hier zelf dus een denkfout, replace() is natuurlijk ook niet bedoelt om submatches uit een string te halen, daar kan je beter exec() voor gebruiken:
JavaScript:
1
2
var k = /q=(.+?)&/.exec(url);
document.write(k[1]);

Intentionally left blank


  • pim
  • Registratie: Juli 2001
  • Laatst online: 22-05 23:05
Thanx, zo werkt ie helemaal perfect!

2 dingen:
- Is (.+?) niet hetzelfde als (.*) ?
- wat betekend "greedy" ? :)

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

pim:
Thanx, zo werkt ie helemaal perfect!

2 dingen:
- Is (.+?) niet hetzelfde als (.*) ?
Nee, de vraagteken betekent hier "reverse greediness". Aangezien de regular expressions in javascript standaard greedy zijn, wordt de operator + door de vraagteken erachter non-greedy.
- wat betekend "greedy" ? :)
Wanneer een repetition operator greedy is, wordt gematched op alles totaan de laatste volgende subexpressie.

code:
1
/.*b/


greedy

Wanneer deze regex wordt losgelaten op de string "abcdefabc" wordt de eerste match abcdefab.

non-greedy
Wanneer deze regex wordt losgelaten op de string "abcdefabc" wordt de eerste match ab

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

en het verschil tussen * en + is dat * equivalent is aan {0,} oftewel 0 of meer matches, en + is equivalent aan {1,} oftewel 1 of meer matches ;)

[ Voor 3% gewijzigd door crisp op 02-12-2003 12:56 ]

Intentionally left blank


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Ik kan me de gedachtengang wel voorstellen, want als je schrijft
code:
1
/(.+)?/
is dat wel hetzelfde als
code:
1
/.*/
:)

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • pim
  • Registratie: Juli 2001
  • Laatst online: 22-05 23:05
Ok, nog een vraagje om te kijken of de code korter kan.

Ik moet nu voor een hoop verschillende searchengines dit stukje lichtelijk aanpassen:

Google:
var k = /q=(.+?)(&|$)/.exec(url);

Lycos:
var k = /query=(.+?)(&|$)/.exec(url);

Overture:
var k = /keywords=(.+?)(&|$)/.exec(url);

Ilse:
var k = /search_for=(.+?)(&|$)/.exec(url);

Is het mogelijk om het dikgedrukte stukje variabel te maken, zodat ik het in een functie kan zetten?

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Je weet toch al wat het pipe symbol doet?
probeer maar 's:
code:
1
/match (dit|dat|zus|zo)/

matcht op de volgende strings:
[list]• match dit
• match dat
• match zus
• match zo

Lijkt mij niet erg lastig om er dan achter te komen hoe je je vraag in een regex moet verwerken.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • pim
  • Registratie: Juli 2001
  • Laatst online: 22-05 23:05
Je hebt gelijk, kan hem idd wel gewoon zo doen:

code:
1
2
var k = /(q=|query=|p=|key=|search=|\/web\/|terms=|qkw=|keywords=|search_for=)(.+?)(&|$)/.exec(u);
document.write(k[2]);

Verwijderd

wtf. Zoveel omslachtige oplossingen voor een makkelijk probleem.

Trek alles (met regex) weg tussen q en w (dat wilde je toch)
Split daarna alles op '&', en split die content weer op '='

hou je prachtige array over met al je shit

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Verwijderd schreef op 02 december 2003 @ 17:46:
wtf. Zoveel omslachtige oplossingen voor een makkelijk probleem.

Trek alles (met regex) weg tussen q en w (dat wilde je toch)
Split daarna alles op '&', en split die content weer op '='

hou je prachtige array over met al je shit
Het gaat alleen om de keywords, maar dan in verschilende soorten URL's. Dat is met 1 regexp op te lossen; wat er verder in de querystring staat boeit gewoonweg niet, dus waarom zou je de hele querystring dan gaan uitsplitsen? :?

Intentionally left blank


  • oh,when?
  • Registratie: April 2000
  • Niet online

oh,when?

...

Verwijderd schreef op 02 december 2003 @ 17:46:
wtf. Zoveel omslachtige oplossingen voor een makkelijk probleem.

Trek alles (met regex) weg tussen q en w (dat wilde je toch)
Split daarna alles op '&', en split die content weer op '='

hou je prachtige array over met al je shit
en wat moet je dan met die array? 'lekker omslachtig' erdoor heen gaan lopen? :D een Regular Expression die hier uitkomt is bijzonder elegant moet ik eerlijk zeggen, en precies waar ze voor bedoeld zijn...dus verklaar u nader over het begrip 'omslachtige oplossing' voor een 'makkelijk probleem' want ik volg het niet helemaal. :)

"You're only as good, as what you did last week."

Pagina: 1