3

In a url like the one below, I'd like to get the value of ProdId. The URL format will always be consistent, as will the parameter name, but the length of the value may change. It will always be numeric.

http://www.example.com/page.php?ProdId=2683322&xpage=2

Using PHP what's the fastest way to get it (I'll be processing 10,000's so speed is an issue)?

bluish
  • 26,356
  • 27
  • 122
  • 180
stef
  • 26,771
  • 31
  • 105
  • 143
  • Do you have strictly controlled input data or is there a chance someone will feed you something malformed? – Anonymoose May 30 '10 at 22:02
  • It *should* always be the same but I'm assuming something malformed will show up at some point. – stef May 30 '10 at 22:19

5 Answers5

13

PHP has built-in functions for this. Use parse_url() and parse_str() together.

Pieced together from php.net:

$url = 'http://www.example.com/page.php?ProdId=2683322&xpage=2';

// Parse the url into an array
$url_parts = parse_url($url);

// Parse the query portion of the url into an assoc. array
parse_str($url_parts['query'], $path_parts);

echo $path_parts['ProdId']; // 2683322
echo $path_parts['xpage']; // 2
Mike B
  • 31,886
  • 13
  • 87
  • 111
  • 2
    Wow, that's fantastic -- I never knew those existed – Michael Mrozek May 30 '10 at 22:17
  • 1
    Awesome, I also did not know these existed. Spent forever trying to work out the proper regex, I'm a noob I know... but I switched to these and done in less than a minute! – Matt K Oct 31 '11 at 19:09
6

Try this regular expression:

^http://www\.example\.com/page\.php\?ProdId=(\d+)
Gumbo
  • 643,351
  • 109
  • 780
  • 844
2

Can't you use $_GET['ProdId']?

bluish
  • 26,356
  • 27
  • 122
  • 180
Funky Dude
  • 3,867
  • 2
  • 23
  • 33
  • Well, if he's analyzing the URL of the page he's currently on, yes, but if he'll "be processing 10,000's" he's probably not doing that – Michael Mrozek May 30 '10 at 22:10
  • Exactly: imagine a DB table with 10,000 URLs that go through my script, I can't use $_GET for that. – stef May 30 '10 at 22:13
2

Try this function:

/https?:\/{2}(?:w{3}\.)?[-.\w][^\.]+\.{2,}\/ProdId=\d+\&xpage=\d+/
The Mask
  • 17,007
  • 37
  • 111
  • 185
Jet
  • 1,283
  • 10
  • 7
0
/^[^#?]*\?(?:[^#]*&)?ProdId=(\d+)(?:[#&]|$)/

And the same in English:

  1. Match anything except ? or # (this will get us to the beginning of the query string or the hash part, whichever comes first)
  2. Match the ? (if there was only a hash part, this will disqualify the match)
  3. Optionally match anything (but not a #, in case there's a hash part) followed by &
  4. Match your key value pair putting the value in a capturing subpattern
  5. Match either the next param's &, the # or the end of the string.
Matti Virkkunen
  • 63,558
  • 9
  • 127
  • 159