ФорумПрограммированиеПыхнуть хотите?Готовые решения → whois класс

whois класс

  • VaseninM

    Сообщения: 2417 Репутация: N Группа: Адекваты

    Spritz 6 октября 2010 г. 13:22

    <?php

    class whois {
       
       protected $tldName;
       protected $domainName;
       protected $aInfo = array();
       protected $sInfo = &#39;&#39;;
       
       private $conf = array();


       public function __construct ($domain, $conf) {
           $this->conf = $conf;
           $domain = $this->validate($domain);
           $this->parseDomain($domain);
           $this->getAnswer();
       }
       
       public function getText ($html = false) {
           return $html ? nl2bt($this->sInfo) : $this->sInfo;
       }
       
       public function getInfo ($element = false) {
           return $element ? $this->aInfo[strtolower($element)] : $this->aInfo;
       }
       
       public function isAvailable() {
           return (stripos($this->sInfo, $this->conf[$this->tldName][&#39;server&#39;][1]) === false) ? false : true;
       }
       
       public function getRegDate() {
           return $this->getPart(&#39;created&#39;);
       }
       
       public function getExpireDate() {
           return $this->getPart(&#39;expire&#39;);
       }
       
       public function getNS() {
           return $this->getPart(&#39;ns&#39;);
       }

       private function getPart($type) {
           $info = $this->aInfo[strtolower($this->conf[$this->tldName][$type])];
           if (!$info &amp;&amp; $this->conf[$this->tldName][&#39;regexp&#39;][$type]) {
               preg_match($this->conf[$this->tldName][&#39;regexp&#39;][$type], $this->sInfo, $info);
               $info = $info[1];
           }
           return $info;
       }
       
       private function parseDomain($domain) {
           $this->tldName = explode(&quot;.&quot;, $domain);
           $this->domainName = array_shift($this->tldName);
           $this->tldName = implode(&#39;.&#39;, $this->tldName);
       }
       
       protected function getAnswer() {
           $server = $this->conf[$this->tldName][&#39;server&#39;][0];
           $domain = $this->domainName . &#39;.&#39; . $this->tldName;
           if ($this->conf[$this->tldName][&#39;server&#39;][2]) {
               $this->getDoubleAnswer($domain, $server);
           } else {
               $this->getSimpleAnswer($domain, $server);
           }
       }
       
       protected function getSimpleAnswer($domain, $server) {
           $fp = @fsockopen($server, 43);
           if (!$fp) throw new Exception (&#39;Whois server not available.&#39;);
           fputs($fp, &quot;$domain\r\n&quot;);
           $this->sInfo = &#39;&#39;;
           $answer = array();
           while (!feof($fp)) {
               $answer[] = trim(fgets($fp, 128));
           }
           for ($i = 0;$i<count($answer);$i++) {
               $sInfo = $answer[$i];
               $this->sInfo .= &quot;$sInfo\r\n&quot;;
               $aInfo = array_map(&#39;trim&#39;, explode(&#39;:&#39;, $sInfo, 2));
               if (count($aInfo) == 2  &amp;&amp; preg_match(&#39;/^[-a-z ]+$/i&#39;, $aInfo[0])) {
                   if (!empty($aInfo[1])) {
                       if (!isset($this->aInfo[strtolower($aInfo[0])])) {
                           $this->aInfo[strtolower($aInfo[0])] = $aInfo[1];
                       } else {
                           if(is_array($this->aInfo[strtolower($aInfo[0])])) {
                               $this->aInfo[strtolower($aInfo[0])][] = $aInfo[1];
                           } else {
                               $this->aInfo[strtolower($aInfo[0])] = array($this->aInfo[strtolower($aInfo[0])], $aInfo[1]);
                           }
                       }
                   } else {
                       
                       do {
                           $i++;
                           $string = $answer[$i];
                           if(empty($string) || strpos($string, &#39;:&#39;) !== false) break;
                           $this->sInfo .= &quot;$string\r\n&quot;;
                           $this->aInfo[strtolower($aInfo[0])][] = $string;
                       } while (!empty($string) &amp;&amp; strpos($string, &#39;:&#39;) === false);
                       $i–;
                   }
               }
           }
       }

       protected function getDoubleAnswer($domain, $server) {
           $fp = @fsockopen($server, 43);
           if (!$fp) throw new Exception (&#39;Whois server not available.&#39;);
           fputs($fp, &quot;$domain\r\n&quot;);
           $this->sInfo = &#39;&#39;;
           while (!feof($fp)) {
               $sInfo = trim(fgets($fp, 128));
               $this->sInfo .= &quot;$sInfo\r\n&quot;;
               $aInfo = array_map(&#39;trim&#39;, explode(&#39;:&#39;, $sInfo, 2));
               if (strtolower($aInfo[0]) == &#39;whois server&#39;) {
                   $doubleServer = $aInfo[1];
               }
           }
           $doubleServer = $doubleServer ? $doubleServer : &#39;whois.networksolutions.com&#39;;
           $this->getSimpleAnswer($domain, $doubleServer);  
       }

       protected function validate ($domain) {
           preg_match (&#39;#^(?:(?:http|https|ftp|svn)?://)?([a-z0-9\.\-]+)(?:/(?:.*))?$#i&#39;, $domain, $domain);
           if (!$domain) throw new Exception(&#39;Not Valid Domain&#39;);
           $domain = $domain[1];  
           if (in_array(&#39;-&#39;, array($domain{1}, substr($domain, -1))) &amp;&amp; strpos($domain, &#39;–&#39;) !== false) throw new Exception(&#39;Not Valid Domain&#39;);
           return $domain;
       }

    }

    //Настройки Хуиза
    $whoisConf = array (
           &#39;ru&#39; => array(
               &#39;server&#39; => array(&#39;whois.ripn.ru&#39;, &#39;No entries found&#39;),
               &#39;created&#39; => &#39;created&#39;,
               &#39;expire&#39; => &#39;paid-till&#39;,
               &#39;ns&#39; => &#39;nserver&#39;
           ),
           &#39;su&#39; => array(
               &#39;server&#39; => array(&#39;whois.ripn.ru&#39;, &#39;No entries found&#39;),
               &#39;created&#39; => &#39;created&#39;,
               &#39;expire&#39; => &#39;paid-till&#39;,
               &#39;ns&#39; => &#39;nserver&#39;
           ),
           &#39;com&#39; => array(
               &#39;server&#39; => array(&#39;whois.crsnic.net&#39;, &#39;No match&#39;, true),
               &#39;created&#39; => &#39;Creation date&#39;,
               &#39;expire&#39; => &#39;Expiration Date&#39;,
               &#39;ns&#39; => &#39;Domain servers in listed order&#39;,
               &#39;regexp&#39; => array(
                   &#39;created&#39; => &#39;/Record created on ([0-9]{2}-[a-z]{3}-[0-9]{4})/i&#39;,
                   &#39;expire&#39; => &#39;/Record expires on ([0-9]{2}-[a-z]{3}-[0-9]{4})/i&#39;,
               )
           ),
           &#39;net&#39; => array(
               &#39;server&#39; => array(&#39;whois.crsnic.net&#39;, &#39;No match&#39;, true),
               &#39;created&#39; => &#39;Creation Date&#39;,
               &#39;expire&#39; => &#39;Expiration Date&#39;,
               &#39;ns&#39; => &#39;Domain servers in listed order&#39;,
               &#39;regexp&#39; => array(
                   &#39;created&#39; => &#39;/Record created on ([0-9]{2}-[a-z]{3}-[0-9]{4})/i&#39;,
                   &#39;expire&#39; => &#39;/Record expires on ([0-9]{2}-[a-z]{3}-[0-9]{4})/i&#39;,
               )
           ),
           &#39;org&#39; => array(
               &#39;server&#39; => array(&#39;whois.pir.org&#39;, &#39;NOT FOUND&#39;),
               &#39;created&#39; => &#39;Created On&#39;,
               &#39;expire&#39; => &#39;Expiration Date&#39;,
               &#39;ns&#39; => &#39;Name Server&#39;
           ),
           &#39;biz&#39; => array(
               &#39;server&#39; => array(&#39;whois.biz&#39;, &#39;Not found&#39;),
               &#39;created&#39; => &#39;Name Server:&#39;,
               &#39;expire&#39; => &#39;Expiration Date&#39;,
               &#39;ns&#39; => &#39;Name Server&#39;
           ),
           &#39;info&#39; => array(
               &#39;server&#39; => array(&#39;whois.afilias.info&#39;, &#39;Not found&#39;),
               &#39;created&#39; => &#39;Created On&#39;,
               &#39;expire&#39; => &#39;Expiration Date&#39;,
               &#39;ns&#39; => &#39;Name Server&#39;
           ),
           &#39;mobi&#39; => array(
               &#39;server&#39; => array(&#39;whois.dotmobiregistry.net&#39;, &#39;NOT FOUND&#39;),
               &#39;created&#39; => &#39;Created On&#39;,
               &#39;expire&#39; => &#39;Expiration Date&#39;,
               &#39;ns&#39; => &#39;Name Server&#39;
           ),
           &#39;name&#39; => array(
               &#39;server&#39; => array(&#39;whois.nic.name&#39;, &#39;No match&#39;),
               &#39;created&#39; => &#39;Created On&#39;,
               &#39;expire&#39; => &#39;Expires On&#39;,
               &#39;ns&#39; => &#39;Name Server&#39;
           ),
           &#39;tv&#39; => array(
               &#39;server&#39; => array(&#39;whois.nic.tv&#39;, &#39;No match&#39;),
               &#39;created&#39; => &#39;Creation date&#39;,
               &#39;expire&#39; => &#39;Expiration date&#39;,
               &#39;ns&#39; => &#39;Name Server&#39;
           ),
           &#39;cn&#39; => array(
               &#39;server&#39; => array(&#39;whois.cnnic.net.cn&#39;, &#39;No entries found&#39;),
               &#39;created&#39; => &#39;Registration Date&#39;,
               &#39;expire&#39; => &#39;Expiration Date&#39;,
               &#39;ns&#39; => &#39;Name Server&#39;
           ),
           &#39;ki&#39; => array(
               &#39;server&#39; => array(&#39;whois.nic.ki&#39;, &#39;NOT FOUND&#39;),
               &#39;created&#39; => &#39;Created&#39;,
               &#39;expire&#39; => &#39;Expires&#39;,
               &#39;ns&#39; => &#39;Name Server&#39;
           ),
           &#39;in&#39; => array(
               &#39;server&#39; => array(&#39;whois.inregistry.in&#39;, &#39;NOT FOUND&#39;),
               &#39;created&#39; => &#39;Created On&#39;,
               &#39;expire&#39; => &#39;Expiration Date&#39;,
               &#39;ns&#39; => &#39;Name Server&#39;
           ),
           &#39;mn&#39; => array(
               &#39;server&#39; => array(&#39;whois2.afilias-grs.net&#39;, &#39;NOT FOUND&#39;),
               &#39;created&#39; => &#39;Created On&#39;,
               &#39;expire&#39; => &#39;Expiration Date&#39;,
               &#39;ns&#39; => &#39;Name Server&#39;
           ),
           &#39;cc&#39; => array(
               &#39;server&#39; => array(&#39;whois.nic.cc&#39;, &#39;No match&#39;),
               &#39;created&#39; => &#39;Creation Date&#39;,
               &#39;expire&#39; => &#39;Expiration Date&#39;,
               &#39;ns&#39; => &#39;Name Server&#39;
           ),
           &#39;ws&#39; => array(
               &#39;server&#39; => array(&#39;whois.worldsite.ws&#39;, &#39;No match for&#39;),
               &#39;created&#39; => &#39;Domain Created&#39;,
               &#39;expire&#39; => &#39;Domain Currently Expires&#39;,
               &#39;ns&#39; => &#39;Name Server&#39;
           ),
           &#39;asia&#39; => array(
               &#39;server&#39; => array(&#39;whois.nic.asia&#39;, &#39;NOT FOUND&#39;),
               &#39;created&#39; => &#39;Domain Create Date&#39;,
               &#39;expire&#39; => &#39;Domain Expiration Date&#39;,
               &#39;ns&#39; => &#39;Nameservers&#39;
           ),
    );

    буду благоарен за кодревью =)
  • phpdude

    Сообщения: 26617 Репутация: N Группа: в ухо

    Spritz 6 октября 2010 г. 13:34, спустя 11 минут 10 секунд

    ценное из этого - массив, остальное не важно :D
    Сапожник без сапог
  • VaseninM

    Сообщения: 2417 Репутация: N Группа: Адекваты

    Spritz 6 октября 2010 г. 13:43, спустя 9 минут 43 секунды

    phpdude, ну да. Ради него я и делал. Но с разнообразием хуйответов конечно сложно боротся. Посторально сделать максимально гибко =)
  • NRG

    Сообщения: 4761 Репутация: N Группа: в ухо

    Spritz 6 октября 2010 г. 13:47, спустя 3 минуты 58 секунд

    я как всегда приебусь к стилю.
    ты вкурсе что именование протектед/приват методов/свойств начинается с андерскора ?
    и где пхпдоки блеать ??
  • phpdude

    Сообщения: 26617 Репутация: N Группа: в ухо

    Spritz 6 октября 2010 г. 13:49, спустя 1 минуту 35 секунд

    NRG, суровый доебчивый пацик! {+++24+++}
     if (!isset($this->aInfo[strtolower($aInfo[0])])) {
    $this->aInfo[strtolower($aInfo[0])] = $aInfo[1];
    } else {
    if(is_array($this->aInfo[strtolower($aInfo[0])])) {
    $this->aInfo[strtolower($aInfo[0])][] = $aInfo[1];
    } else {
    $this->aInfo[strtolower($aInfo[0])] = array($this->aInfo[strtolower($aInfo[0])], $aInfo[1]);
    }
    }
    блеять … {+++29+++} рефакторинг бы тут не помешал, хотя бы так ..

    $aInfo0 = strtolower($aInfo[0]);
    Сапожник без сапог
  • Абырвалг

    Сообщения: 6477 Репутация: N Группа: Джедаи

    Spritz 6 октября 2010 г. 13:50, спустя 44 секунды

    ща, еще бутылочка пивка и будет тебе ревью) {+++17+++} вот так новость: 4 новых ответа
  • NRG

    Сообщения: 4761 Репутация: N Группа: в ухо

    Spritz 6 октября 2010 г. 13:51, спустя 1 минуту 2 секунды

    public function isAvailable() {
           return (stripos($this->sInfo, $this->conf[$this->tldName][&#39;server&#39;][1]) === false) ? false : true;
       }


    public function isAvailable() {
           return !(stripos($this->sInfo, $this->conf[$this->tldName][&#39;server&#39;][1]) === false);
       }
  • Абырвалг

    Сообщения: 6477 Репутация: N Группа: Джедаи

    Spritz 6 октября 2010 г. 13:53, спустя 1 минуту 58 секунд

    ты вкурсе что именование протектед/приват методов/свойств начинается с андерскора ?

    чушь говоришь. Это было нужно во времена php4, когда не было реальных PPP. Теперь же - только пальцы ломать, нажимая шифт. Кроме того, если работаешь с чужим кодом - можно проебать какой-то метод, забыв посмотреть - а есть ли такой, но начинающийся с &quot;_&quot; {+++44+++} я не говорю о второй доктрине, но даже zf2 будет без этой хуйни с _
  • NRG

    Сообщения: 4761 Репутация: N Группа: в ухо

    Spritz 6 октября 2010 г. 13:54, спустя 1 минуту 38 секунд

    Абырвалг, когда будет, тогда и поговорим.
    а чтоб впустую не балабольствовать достаточно просто пойти на сайт зенда и посмотреть кодинг стандарты
  • Абырвалг

    Сообщения: 6477 Репутация: N Группа: Джедаи

    Spritz 6 октября 2010 г. 13:55, спустя 21 секунду

    NRG,
    return stripos($this->sInfo, $this->conf[$this->tldName][&#39;server&#39;][1]) !== false;
  • NRG

    Сообщения: 4761 Репутация: N Группа: в ухо

    Spritz 6 октября 2010 г. 13:57, спустя 2 минуты 4 секунды

    да, можно и так
  • Абырвалг

    Сообщения: 6477 Репутация: N Группа: Джедаи

    Spritz 6 октября 2010 г. 14:08, спустя 11 минут 4 секунды

    Абырвалг, когда будет, тогда и поговорим.

    http://stackoverflow.com/questions/3748053/zend-framework-2-underscore-private
    похоже я что-то напутал.

    Но вот доктрина вторая точно будет без этих префксов http://www.doctrine-project.org/jira/browse/DDC-536 {+++98+++} еще вариант
    return is_int($this->sInfo, $this->conf[$this->tldName][&#39;server&#39;][1]);
  • VaseninM

    Сообщения: 2417 Репутация: N Группа: Адекваты

    Spritz 6 октября 2010 г. 14:18, спустя 10 минут 9 секунд

    ты вкурсе что именование протектед/приват методов/свойств начинается с андерскора ?

    вкурсе. Просто как то неудобно писать _ перед методами и переменными. Вот и игнорирую это правило(.
    и где пхпдоки блеать ??

    В таких маленьких классах пишу их обычно после того, как привожу класс в финальное состояне. А тут еще типа бетта версия чтоли.
    блеять …

    да пожалуй.
    NRG, угу. Сеньк.
  • OFF

    Сообщения: ? Репутация: N Группа: Адекваты

    Spritz 6 октября 2010 г. 14:57, спустя 38 минут 55 секунд

    SpartakuS, Спасибо. Я возьму это.
  • Troy

    Сообщения: 2533 Репутация: N Группа: Джедаи

    Spritz 7 октября 2010 г. 7:21, спустя 16 часов 24 минуты 6 секунд

    Пишу всегда приват методы с _ , читабельно

Пожалуйста, авторизуйтесь, чтобы написать комментарий!