Login   Register  
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: 10 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
?>