Patrick Talmadge
Regex Flickr Parser
Today’s Regex is used to parse a string for Flickr links and extract the Photo_ID. Once we have the Photo_ID we’re able to create a standard embed code from nearly any Flickr URL.
Supported Links:
The following Regex supports these Flickr links and embed code snippets.
Normal URL : http://www.flickr.com/photos/gambort/6501997531/
Short URL : http://flic.kr/p/aUyrkH
Embed : >a href="http://www.flickr.com/photos/gambort/6501997531/"
title="Skyrim black dragon by gambort, on Flickr"><img
src="http://farm8.staticflickr.com/7004/6501997531_80aa9da91a.jpg"
width="500" height="334" alt="Skyrim black dragon"></a>
****Short Code id needs to be decoded and replaced with the full photo ID****
Again, I’ve broken it up the Regex and commented each line.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | $regexstr = '~ # Match Flickr link and embed code (?:<a [^>]*href=")? # If a tag match up to first quote of src (?: # Group Flickr url https?:\/\/ # Either http or https (?:[\w]+\.)* # Optional subdomains (?: # Group host alternatives. flic\.kr # Either flic.kr | flickr\.com # or flickr.com ) # End Host Group (?:\/photos)? # Optional video sub directory \/[^\/]+\/ # Slash and stuff before Id ([0-9a-zA-Z]+) # $1: PHOTO_ID is numeric [^\s]* # Not a space ) # End group "? # Match end quote if part of src (?:.*></a>)? # Match the end of the a tag ~ix'; |
Usage Example:
This example is more involved than the previous posts because we need to make an API call to get the image URL after we get the Flickr Photo_ID. I’ve also included a Base58 decode function incase the url is the short flic.kr style link.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | function ParseForFlickr($string){ $regexstr = <<REGEX FROM ABOVE>>; require_once('phpFlickr.php'); $f = new phpFlickr("<<Flickr API Key>>"); preg_match_all($regexstr, $string, $matches, PREG_SET_ORDER); //Loop results foreach ($matches as $val) { //If short code decode it if (strpos($val[0], "flic.kr") !== false) { $val[1] = $this->flickrDecode($val[1]); } //make flickr api call with photo id $pinfo = $f->photos_getSizes($val[1]); //Array 3 is the medium 500 size $imgstr = ' <p><img class="upostimg" src="'.$pinfo[3]['source'].'" /></p> '; $string = str_replace($val[0],$imgstr,$string); } return $string; } function flickrDecode($num){ $alphabet = "123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ"; $decoded = 0; $multi = 1; while (strlen($num) > 0) { $digit = $num[strlen($num)-1]; $decoded += $multi * strpos($alphabet, $digit); $multi = $multi * strlen($alphabet); $num = substr($num, 0, -1); } return $decoded; } |
For more Regex see Regex YouTube Parser or Regex Vimeo Parser
My Twitter
- Apple should allow people to pre order unannounced products just to see who the real #apple #fanboys are. 20 hours ago
- Started the SAAS class http://t.co/LV2EitqG Just wish it wasn't so Rails oriented. Not everyone is a #RoR #fanboy. 2012/02/21
- I can wait for the purse dog fashion statement to go away. I don't need to see your dog in the mall. 2012/02/18
- Nothing like early morning coding. Client side code clean up. #jquery #ui 2012/02/18
- RT @newsycombinator: I would rather drink piss like Bear Grylls than log in with Facebook http://t.co/4cb0kyiJ 2012/02/17
- Yesss!, @chi_llc followed me back. Woot... Woot... bring on the 3D software tweets :) 2012/02/17
- Bye Bye, Hulu+... & your silly content deals. Why can't I watch some shows on my TV! Mountian Lion just put the final nail in. 2012/02/16
- Mountain Lion looks cool. http://t.co/QFdtKD68 but I really hope Apple doesn't screw up #OSX by turning it into #iOS. 2012/02/16
- I have to say mustache.js makes front end development super easy #mustache #jquery 2012/02/15
- Nothing says Valentines Day like Twitter Spam. Thanks for the link, random spam bot with half naked picture. I'll click it later, trust me! 2012/02/14
Archives
- December 2011
- October 2011
- August 2011
- June 2011
- April 2011
- March 2011
- February 2011
- December 2010
- November 2010
- October 2010
- August 2010
- June 2010
- May 2010
- April 2010
- March 2010
- February 2010
- January 2010
- December 2009
- November 2009
- October 2009
- September 2009
- August 2009
- July 2009
- June 2009
- May 2009
- April 2009
- March 2009
- February 2009
- January 2009
- December 2008
- November 2008
- September 2007
- July 2007
- June 2007
- April 2007
- March 2007
- February 2007
- January 2007
- December 2006
- November 2006






