PHP Classes
elePHPant
Icontem

File: class.ianacclister.php

Recommend this page to a friend!
Stumble It! Stumble It! Bookmark in del.icio.us Bookmark in del.icio.us
  Classes of Kevin Hagel  >  class.ianacclister.php  >  class.ianacclister.php  >  Download  
File: class.ianacclister.php
Role: Class source
Content type: text/plain
Description: IANA country-code list page processor
Class: class.ianacclister.php
Reads IANA CountryCodes into a hash
Author: By
Last change: Added "code" => $code to hash, for use in array_values($hash) kind of thing. Smarty in particular doesn't loop throug non-numeric assocs to well.
Date: 11 years ago
Size: 5,327 bytes
 

Contents

Class file image Download
<?php
/**
 * Here is the ianacclister class DocBlock
 * @package IANATools
 * @author Kevin Hagel <khote@mminternet.com>
 * @version $Revision: 2.0 $
 * @since January 23, 2002 Rewritten: April 27, 2004
 *
 * Goes to the iana country code listing page, reads in all the data and builds
 * a hash keyed on the two-letter country code.
 *
 * This class was originally designed to output an actual html table, but that's not
 * all that MVC is it? Now it just loads the information from IANA and builds a
 * country-code keyed hash. You decide yourself what to do with it.
 *
 * Modification History:
 * Apr 30, 2004 - Added 'code' => $code to the hash, some PHP functions don't like
 * or aren't as easy to use when keyed by the code, I decided to include it in
 * the record for each ccode to allow foreach($has as $cc=>$data).. $code=$data['code']
 *
 * Example Usages:
 *
 * include_once ('$wherever/class.ianacclister.php');
 * $lister = new ianacclister();
 * $hash =& $lister->getHash();
 *
 * $hash =& ianacclister::getHash();
 */
require_once 'PEAR.php';
if (!
defined(IANACCLISTER_CONSTANTS))
{
   
define("IANACCLISTER_CONSTANTS", true);
   
// Location of source
   
define("IANACCLISTER_URL", "http://www.iana.org/cctld/cctld-whois.htm");
   
// Used to fix whois links
   
define("IANACCLISTER_IANA_HOME", "http://www.iana.org/");

   
// Errors
   
define("IANACCLISTER_ERROR", -1);
   
define("IANACCLISTER_ERROR_URLFAILED", -10);
}
class
ianacclister extends PEAR
{
   
/**
     * @access private
     * @var containing generated output
     */
   
var $_hash = NULL;
    var
$error = NULL;

   
/**
     * Constructor
     * @param bool causes me to build the has on construction.
     * defaults to false;
     */
   
function ianacclister($autoload = FALSE)
    {
       
$this->PEAR();
        if(
$autoload) $this->_buildHash();
    }

   
/**
     * builds the country codes hash, stores it in the class variable.
     * @access private
     */
   
function _buildHash()
    {

       
$this->_hash = array();
       
$fix = IANACCLISTER_IANA_HOME."root-whois";
       
$page = join('',file(IANACCLISTER_URL));
        if(!
$page) {
           
$this->error = PEAR::raiseError("Unable To Access " . IANACCLISTER_URL);
            return;
        }

       
$search = array(
           
"'[\n|\r|\n\r|\r\n]'", // dump all newlines NOW
           
"'.*<BLOCKQUOTE>'i", // everything before <BLOCKQUOTE> inclusive
           
"'<\/BLOCKQUOTE>.*'i", // everything after </BLOCKQUOTE> inclusive
           
"'\s+'", // mult spaces
           
"'&(nbsp|#160);'i", // &#nbsp; spaces to one actual space
           
"'\s+&(nbsp|#150);\s+'i", // code for '-' to actual '-', dump lead/trail space
           
"'<BR>'i", // Dump them all
           
"'<A NAME=\".\"><\/A>'i", // internal links we don't want
           
"'(<FONT FACE=\"Arial\">|<\/FONT>)'i", // dump the font stuff
           
"'(<P>|</P>)'i", // should just be one
           
"'\/root-whois'i", // fix to full URL
           
"'<A HREF=\"(.*)\">'i", // extract the actual link
           
"'\.(.{2})-'i", // extract country code itself
           
"'<\/A>'i", // more garbage
       
);

       
$replace= array(
           
"", // newlines
           
"", // before <BLOCKQUOTE>
           
"", // after </BLOCKQUOTE>
           
" ", // mult spaces to one space
           
" ", // &#nbsp to space
           
"-", // " &#150 " to "-"
           
"\n", // <BR>
           
"", // name =
           
"", // font stuff
           
"", // <p>
           
$fix, // from /root-whois/etc.htm to full url
           
"\\1\n", // just keep the link part
           
"\\1\n", // just keep the country code
           
"%", // country name followed by extra newline and '%' for splitting
       
);
       
$page = preg_replace($search,$replace,$page);

       
//
        // Ok, at this point the individual records are all stashed in the string, separated
        // by a '%' character, which we're going to split on.
        //

       
$prerecords = explode("%",$page);
        for(
$i=0;$i<count($prerecords);$i++) {
           
$record = explode("\n",trim($prerecords[$i]));
            if(empty(
$record))
                continue;
           
$whoisurl = trim($record[0]);
           
$ccode = trim($record[1]);
           
$name = trim($record[2]);
            if(!empty(
$whoisurl)&&!empty($ccode)&&!empty($name))
             
$this->_hash[$ccode] = array("code" => $ccode, "name"=>$name, "whois"=>$whoisurl);
        }
        return
$this->_hash;
    }


   
/**
     * Returns the hash, auto-creating it if
     * not currently set.
     */
   
function &getHash()
    {
       
// are we being used as ianacclister::getHash() ?
       
if (!isset($this) or get_class($this) != 'ianacclister') {
           
$this = & new ianacclister(TRUE);
            return
$this->_hash;
        }
       
// check to see if hash has been build.
       
if($this->_hash == NULL)
           
$this->_buildHash();
        return
$this->_hash;
    }





}
// class ianacclister
?>