array( 'user_agent' => 'Mozilla/5.0 (compatible; IP range generator)', 'header' => 'Referer: ' . $referer_url . "\r\n", ), ))); if (!$content) { exit (2); } /** * Parse the HTML/Excel document. */ $regex = '#\\s*]+>([0-9a-f:]+::)\\s*]+>(/[0-9]+)#iU'; preg_match_all($regex, $content, $matches, PREG_SET_ORDER); /** * Extract the address and netmask for each range. */ $ranges = array(); foreach ($matches as $match) { $start = str_pad(str_replace(':', '', strtolower($match[1])), 16, '0', STR_PAD_RIGHT); $mask = str_repeat('f', ((64 - trim($match[2], '/')) / 4)); $end = substr($start, 0, 16 - strlen($mask)) . $mask; $ranges[$start] = array($start, $end); } /** * Sort the ranges. */ ksort($ranges); $ranges = array_values($ranges); $count = count($ranges); /** * Merge adjacent ranges. */ for ($i = 0; $i < $count; $i++) { if ($i == 0) continue; $previous_i = $i - 1; while (true) { if ($ranges[$previous_i] !== null) break; $previous_i--; } if (hexdec($ranges[$i][0]) == hexdec($ranges[$previous_i][1]) + 1) { $ranges[$previous_i][1] = $ranges[$i][1]; $ranges[$i] = null; } } /** * Organize into final format. */ $ranges_final = array(); foreach ($ranges as $range) { if ($range !== null) $ranges_final[] = $range; } /** * Save to file. */ $content = '<' . '?php' . "\n\n" . '/**' . "\n" . ' * Source: ' . $referer_url . "\n"; $content .= ' * Last Updated: ' . date('Y-m-d') . "\n" . ' */' . "\n"; $content .= 'return ' . var_export($ranges_final, true) . ';' . "\n"; file_put_contents(__DIR__ . '/../../common/defaults/korea.ipv6.php', $content); /** * Report status. */ echo count($ranges_final) . ' IPv6 ranges saved.' . PHP_EOL;