'Invalid Domain')); die(); } else { $domainArr = array_slice($explodedDomain, -2); $domain = implode(".", $domainArr); //$domain = $explodedDomain[$explodedCount-2].".".$explodedDomain[$explodedCount-1]; if($explodedCount >= 3){ if(array_key_exists($explodedDomain[$explodedCount-1], $whoisservers)){ if(array_key_exists($explodedDomain[$explodedCount-2], $whoisservers)){ //$domain = $explodedDomain[$explodedCount-3].".".$explodedDomain[$explodedCount-2].".".$explodedDomain[$explodedCount-1]; $domainArr = array_slice($explodedDomain, -3); $domain = implode(".", $domainArr); } } else { echo json_encode(array('error'=>'No matching nic server found!')); die(); } } $tld = substr($domain, strrpos($domain, '.') + 1); $serverUrl = $whoisservers[$tld]; // connect to whois server: $loop = true; $count = 0; while($loop) { $f = fsockopen($serverUrl, 43); $needToBeAddEqual = ["whois.verisign-grs.com", "whois.verisign-grs.net"]; if (in_array($serverUrl, $needToBeAddEqual)) { fputs($f, "=" . $domain . "\r\n"); } else { fputs($f, $domain . "\r\n"); } $data = []; while (!feof($f)){ $data[] = rtrim(fgets($f), "\n"); } $stringsExistToMeanAvailable = ["No Match", "No match", "No match for", "Status: AVAILABLE", "NOT FOUND", "Not found", "No Found", "No information available about domain name", "No matching record.", "No entries found in the AFNIC Database.", "The domain has not been registered.", "Status: free"]; $stringsExistToMeanErrorInput = ["Incorrect input, please try again.", "Error for \""]; $stringsExistToMeanWaitSomeTime = ["Please maintain at least " => "Please maintain at least %d-second time before starting another enquiry."]; foreach($data as $eachLine) { foreach($stringsExistToMeanAvailable as $stringExistToMeanAvailable){ if(strpos($eachLine, $stringExistToMeanAvailable) !== false){ echo json_encode(['error'=>'No domain found']); die; } } foreach($stringsExistToMeanErrorInput as $stringExistToMeanErrorInput){ if(strpos($eachLine, $stringExistToMeanErrorInput) !== false){ echo json_encode(['error'=>'Invalid domain']); die; } } foreach($stringsExistToMeanWaitSomeTime as $stringExistToMeanWaitSomeTime => $sscanfFullString){ if(strpos($eachLine, $stringExistToMeanWaitSomeTime) !== false){ if($sscanfFullString == "N/A"){ echo json_encode(['error'=>'Please wait sometime']); }else{ sscanf($eachLine, $sscanfFullString, $second); if(!empty($second)){ echo json_encode(['error'=>'Please wait '.$second.' seconds']); }else{ echo json_encode(['error'=>'Please wait sometime']); } } } } } /* Data loop end */ //print_r($data); $whoisServerFromWhois = parse($data, $domain, 'Domain Name:', ['Whois Server' => 'whois_server','Registrar WHOIS Server'=>'whois_server','WHOIS Server'=>'whois_server'], true); if(!empty($whoisServerFromWhois['whois_server'][0])){ $serverUrl = $whoisServerFromWhois['whois_server'][0]; } if($count>=1){ $loop = false; } $count++; } /* While loop end */ $parsedResult = parse_domain($data, $domain, $tld); if(!empty($parsedResult[0])){ if(array_key_exists('error',$parsedResult)) { echo json_encode($parsedResult); die(); } } else { $new_data = []; foreach($data as $row) { $pieces = explode(':',$row); if(count($pieces)>=2) { if(trim($pieces[0])=='DNSSEC') { break; } else if(trim($pieces[1])!='') { $key = array_shift($pieces); $new_data[trim($key)] = trim(implode(':',$pieces)); } } } echo json_encode($new_data); } } function parse($data, $domain, $domainWord, $keywords, $breakOnEnter) { $found = false; $domainWordLen = strlen($domainWord); $res = []; foreach ($data AS $d) { $d = trim($d); if ($d == '') { if ($breakOnEnter) { $found = false; } continue; } $pos = strpos($d, $domainWord); if ($pos !== false) { $dom = strtolower(trim(substr($d, $pos + $domainWordLen))); if ($dom == $domain) { $found = true; } } if ($found) { $pos = strpos($d, ':'); if ($pos !== false) { $keyword = substr($d, 0, $pos); if (isset($keywords[$keyword])) { $t = trim(substr($d, $pos+1)); if ($t != '') { $res[$keywords[$keyword]][] = $t; } } else { $keyword = ''; } } else if ($keyword) { $res[$keywords[$keyword]][] = $d; } } } return $res; } function parse_domain($data, $domain, $tld) { $domainWords = [ 'def' => 'Domain Name:', 'com' => 'Domain Name:', 'org' => 'Domain Name:', 'net' => 'Domain Name:', 'biz' => 'Domain Name:', 'info' => 'Domain Name:', 'name' => 'Domain Name:', 'asia' => 'Domain Name:', 'pl' => 'DOMAIN NAME:', 'de' => 'Domain:', 'fr' => 'domain:', 'eu' => 'Domain:', 'us' => 'Domain Name:', 'cn' => 'Domain Name:', 'hk' => 'Domain Name:', 'tw' => 'Domain Name:' ]; $domainsKeywords = [ [ 'id' => ['Domain ID', 'Domain Name ID', 'Registry Domain ID', 'ROID'] ], [ 'domain' => ['Domain name', 'Domain Name', 'DOMAIN NAME', 'Domain', 'domain'] ], [ 'bundled_domain' => ['Bundled Domain Name'] ], [ 'dns' => ['Name Server', 'Nameservers', 'Name servers', 'Name Servers Information', 'Domain servers in listed order', 'nserver', 'nameservers'] ], [ 'registrar' => ['Registrar', 'registrar', 'Registrant', 'Registrar Name', 'Created by Registrar'] ], [ 'registrar_url' => ['Registrar URL', 'Registrar URL (registration services)'] ], [ 'sponsoring_registrar' => [ 'Sponsoring Registrar'] ], [ 'whois_server' => ['Whois Server', 'WHOIS SERVER', 'Registrar WHOIS Server'] ], [ 'created' => ['Creation Date', 'Created On', 'Registration Time', 'Domain Create Date', 'Domain Registration Date', 'Domain Name Commencement Date', 'created'] ], [ 'updated' => ['last-update', 'Updated Date', 'Domain Last Updated Date', 'last modified'] ], [ 'expires' => ['Expiry Date', 'Expiration Date', 'Expiration Time', 'Domain Expiration Date', 'Registrar Registration Expiration Date', 'Record expires on', 'Registry Expiry Date', 'renewal date'] ], [ 'status' => ['Status', 'status', 'Domain Status'] ], ]; $toBeParseKeywords = []; foreach ($domainsKeywords as $domainKeywords){ foreach ($domainKeywords as $var => $keywords){ foreach($keywords as $keyword){ $toBeParseKeywords[$keyword] = $var; } } } $contactInfoCategories = [ [ 'id' => ['ID'] ], [ 'name' => ['Name'] ], [ 'organization' => ['Organization'] ], [ 'city' => ['City'] ], [ 'country' => ['Country', 'Country/Economy'] ], [ 'address' => ['Street', 'Address', 'Address1', 'Address2', 'Address3', 'Address4','Postal Code'] ], [ 'state_province' => ['State/Province','State'] ], [ 'postal_code' => ['Postal Code'] ], [ 'email' => ['Email'] ], [ 'phone' => ['Phone', 'Phone Number','Mobile'] ], [ 'phone_ext' => ['Phone Ext', 'Phone Ext.'] ], [ 'fax' => ['Fax', 'FAX', 'Facsimile Number'] ], [ 'fax_ext' => ['Fax Ext', 'FAX Ext.'] ] ]; $contactInfoKeywords = [ [ 'admin' => ['Admin', 'Administrative', 'Administrative Contact'] ], [ 'registrant' => ['Registrant'] ], [ 'tech' => ['Tech', 'Technical', 'Technical Contact'] ], [ 'billing' => ['Bill', 'Billing', 'Billing Contact'] ] ]; foreach ($contactInfoKeywords as $contactInfoKeyword){ foreach($contactInfoKeyword as $contactKey => $contactKeywords){ foreach($contactKeywords as $contactKeyword){ foreach ($contactInfoCategories as $contactInfoCategory){ foreach ($contactInfoCategory as $var => $keywords){ foreach($keywords as $keyword){ $toBeParseKeywords[$contactKeyword." ".$keyword] = $contactKey."_".$var; } } } } } } if(array_key_exists($tld, $domainWords)){ $domainWord = $domainWords[$tld]; }else{ $domainWord = $domainWords['def']; } $data = array_filter(array_map("ifWhiteSpace", $data)); $parseResult = parse($data, $domain, $domainWord, $toBeParseKeywords, true); $needToBeSingles = ["domain", "id"]; foreach($needToBeSingles as $needToBeSingle){ if(!empty($parseResult[$needToBeSingle])){ $parseResult[$needToBeSingle] = $parseResult[$needToBeSingle][0]; } } if(!empty($parseResult['domain'])){ $parseResult['domain'] = strtolower($parseResult['domain']); } $needToBeParsedTimeKeys = ['created', 'expires', 'updated']; foreach($needToBeParsedTimeKeys as $needToBeParsedTimeKey){ if(!empty($parseResult[$needToBeParsedTimeKey])){ $domainTime = $parseResult[$needToBeParsedTimeKey][0]; //if ( (date_parse($domainTime)['warning_count'] == 0) && (date_parse($domainTime)['error_count'] == 0) ) { if (date_parse($domainTime)['error_count'] == 0) { $parsed_date = date_parse($domainTime); $parseResult[$needToBeParsedTimeKey."_parsed"] = $parsed_date; $date_string = date('Y-m-d H:i:s', mktime($parsed_date['hour'], $parsed_date['minute'], $parsed_date['second'], $parsed_date['month'], $parsed_date['day'], $parsed_date['year'])); $parseResult[$needToBeParsedTimeKey."_parsed_string"] = $date_string; }else{ $formatedTime = $domainTime; $formatedTime = str_replace("T", " ", $formatedTime); $formatedTime = str_replace("Z", " ", $formatedTime); $formatedTime = trim($formatedTime); $parsed_date = date_parse_from_format("Y-m-d H:i:s.u", $formatedTime); $parseResult[$needToBeParsedTimeKey."_parsed"] = $parsed_date; $date_string = date('Y-m-d H:i:s', mktime($parsed_date['hour'], $parsed_date['minute'], $parsed_date['second'], $parsed_date['month'], $parsed_date['day'], $parsed_date['year'])); $parseResult[$needToBeParsedTimeKey."_parsed_string"] = $date_string; } } } foreach($parseResult as $eachParseResultKey => $eachParseResult){ if (substr($eachParseResultKey, 0, 6) == "admin_") { unset($parseResult[$eachParseResultKey]); $key = substr($eachParseResultKey, 6); if($key != "address"){ $eachParseResult = $eachParseResult[0]; } $parseResult['admin'][$key] = $eachParseResult; } if (substr($eachParseResultKey, 0, 11) == "registrant_") { unset($parseResult[$eachParseResultKey]); $key = substr($eachParseResultKey, 11); if($key != "address"){ $eachParseResult = $eachParseResult[0]; } $parseResult['registrant'][$key] = $eachParseResult; } if (substr($eachParseResultKey, 0, 5) == "tech_") { unset($parseResult[$eachParseResultKey]); $key = substr($eachParseResultKey, 5); if($key != "address"){ $eachParseResult = $eachParseResult[0]; } $parseResult['tech'][$key] = $eachParseResult; } if (substr($eachParseResultKey, 0, 8) == "billing_") { unset($parseResult[$eachParseResultKey]); $key = substr($eachParseResultKey, 8); if($key != "address"){ $eachParseResult = $eachParseResult[0]; } $parseResult['bill'][$key] = $eachParseResult; } } $needToBeLowerCasedValueFathers = ['registrant', 'admin', 'tech', 'billing']; foreach($needToBeLowerCasedValueFathers as $needToBeLowerCasedValueFather){ if(!empty($parseResult[$needToBeLowerCasedValueFather])){ $needToBeLowerCasedValue = $parseResult[$needToBeLowerCasedValueFather]['email']; if(!empty($needToBeLowerCasedValue)){ $parseResult[$needToBeLowerCasedValueFather]['email'] = strtolower($parseResult[$needToBeLowerCasedValueFather]['email']); } } } $needToAddCompletelyAddressArrays = ['registrant', 'admin', 'tech', 'billing']; foreach($needToAddCompletelyAddressArrays as $needToAddCompletelyAddressArray){ if(!empty($parseResult[$needToAddCompletelyAddressArray])){ if(!empty($parseResult[$needToAddCompletelyAddressArray]["address"])){ $parseResult[$needToAddCompletelyAddressArray]["completely_address"] = implode(", ", $parseResult[$needToAddCompletelyAddressArray]["address"]); /* WILL CITY & COUNTRY WILL BE INCLUDE IN FULL ADDRESS? */ $allExtraInfomations = ["city", "country"]; foreach($allExtraInfomations as $extraInfomation){ if(!empty($parseResult[$needToAddCompletelyAddressArray][$extraInfomation])){ $parseResult[$needToAddCompletelyAddressArray]["completely_address"] .= ", ".$parseResult[$needToAddCompletelyAddressArray][$extraInfomation]; } } $parseResult[$needToAddCompletelyAddressArray]["completely_address"] = ucwords(strtolower($parseResult[$needToAddCompletelyAddressArray]["completely_address"])); } } } if(empty($parseResult)){ return ['error'=>'No data']; } return $parseResult; } function ifWhiteSpace($el){ return trim($el, " "); }