X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=spam%2Fspam.php;h=eaf5952c0dbb5ccbf485015ee48de1768e98a716;hb=2e3b176678a8d38f2adf4e8fdeaacad8ad532407;hp=bb43fea9f1574793597c7d1c08e3f0b432f2d81d;hpb=4e8e74ea6a2e23d6e9ea574ea871857595718aed;p=pukiwiki%2Fpukiwiki_sandbox.git diff --git a/spam/spam.php b/spam/spam.php index bb43fea..eaf5952 100644 --- a/spam/spam.php +++ b/spam/spam.php @@ -1,5 +1,5 @@ = 4.2.0): var_export(): mail-reporting and dump related -if (! function_exists('var_export')) { - function var_export() { - return 'var_export() is not found on this server' . "\n"; - } -} - -// (PHP 4 >= 4.2.0): preg_grep() enables invert option -function preg_grep_invert($pattern = '//', $input = array()) -{ - static $invert; - if (! isset($invert)) $invert = defined('PREG_GREP_INVERT'); - - if ($invert) { - return preg_grep($pattern, $input, PREG_GREP_INVERT); - } else { - $result = preg_grep($pattern, $input); - if ($result) { - return array_diff($input, preg_grep($pattern, $input)); - } else { - return $input; - } - } -} - - -// --------------------- -// Utilities - -// Very roughly, shrink the lines of var_export() -// NOTE: If the same data exists, it must be corrupted. -function var_export_shrink($expression, $return = FALSE, $ignore_numeric_keys = FALSE) -{ - $result = var_export($expression, TRUE); - - $result = preg_replace( - // Remove a newline and spaces - '# => \n *array \(#', ' => array (', - $result - ); - - if ($ignore_numeric_keys) { - $result =preg_replace( - // Remove numeric keys - '#^( *)[0-9]+ => #m', '$1', - $result - ); - } - - if ($return) { - return $result; - } else { - echo $result; - return NULL; - } -} - -// Data structure: Create an array they _refer_only_one_ value -function one_value_array($num = 0, $value = NULL) -{ - $num = max(0, intval($num)); - $array = array(); - - for ($i = 0; $i < $num; $i++) { - $array[] = & $value; - } - - return $array; -} - -// Reverse $string with specified delimiter -function delimiter_reverse($string = 'foo.bar.example.com', $from_delim = '.', $to_delim = NULL) -{ - $to_null = ($to_delim === NULL); - - if (! is_string($from_delim) || (! $to_null && ! is_string($to_delim))) { - return FALSE; - } - if (is_array($string)) { - // Map, Recurse - $count = count($string); - $from = one_value_array($count, $from_delim); - if ($to_null) { - // Note: array_map() vanishes all keys - return array_map('delimiter_reverse', $string, $from); - } else { - $to = one_value_array($count, $to_delim); - // Note: array_map() vanishes all keys - return array_map('delimiter_reverse', $string, $from, $to); - } - } - if (! is_string($string)) { - return FALSE; - } - - // Returns com.example.bar.foo - if ($to_null) $to_delim = & $from_delim; - return implode($to_delim, array_reverse(explode($from_delim, $string))); -} - -// ksort() by domain -function ksort_by_domain(& $array) -{ - $sort = array(); - foreach(array_keys($array) as $key) { - $reversed = delimiter_reverse($key); - if ($reversed !== FALSE) { - $sort[$reversed] = $key; - } - } - ksort($sort, SORT_STRING); - - $result = array(); - foreach($sort as $key) { - $result[$key] = & $array[$key]; - } - - $array = $result; -} - -// Roughly strings(1) using PCRE -// This function is useful to: -// * Reduce the size of data, from removing unprintable binary data -// * Detect _bare_strings_ from binary data -// References: -// http://www.freebsd.org/cgi/man.cgi?query=strings (Man-page of GNU strings) -// http://www.pcre.org/pcre.txt -// Note: mb_ereg_replace() is one of mbstring extension's functions -// and need to init its encoding. -function strings($binary = '', $min_len = 4, $ignore_space = FALSE, $multibyte = FALSE) -{ - // String only - $binary = (is_array($binary) || $binary === TRUE) ? '' : strval($binary); - - $regex = $ignore_space ? - '[^[:graph:] \t\n]+' : // Remove "\0" etc, and readable spaces - '[^[:graph:][:space:]]+'; // Preserve readable spaces if possible - - $binary = $multibyte ? - mb_ereg_replace($regex, "\n", $binary) : - preg_replace('/' . $regex . '/s', "\n", $binary); - - if ($ignore_space) { - $binary = preg_replace( - array( - '/[ \t]{2,}/', - '/^[ \t]/m', - '/[ \t]$/m', - ), - array( - ' ', - '', - '' - ), - $binary); - } - - if ($min_len > 1) { - // The last character seems "\n" or not - $br = (! empty($binary) && $binary[strlen($binary) - 1] == "\n") ? "\n" : ''; - - $min_len = min(1024, intval($min_len)); - $regex = '/^.{' . $min_len . ',}/S'; - $binary = implode("\n", preg_grep($regex, explode("\n", $binary))) . $br; - } - - return $binary; -} - - -// --------------------- -// Utilities: Arrays - -// Count leaves (A leaf = value that is not an array, or an empty array) -function array_count_leaves($array = array(), $count_empty = FALSE) -{ - if (! is_array($array) || (empty($array) && $count_empty)) return 1; - - // Recurse - $count = 0; - foreach ($array as $part) { - $count += array_count_leaves($part, $count_empty); - } - return $count; -} - -// Merge two leaves -// Similar to PHP array_merge_leaves(), except strictly preserving keys as string -function array_merge_leaves($array1, $array2, $sort_keys = TRUE) -{ - // Array(s) only - $is_array1 = is_array($array1); - $is_array2 = is_array($array2); - if ($is_array1) { - if ($is_array2) { - ; // Pass - } else { - return $array1; - } - } else if ($is_array2) { - return $array2; - } else { - return $array2; // Not array ($array1 is overwritten) - } - - $keys_all = array_merge(array_keys($array1), array_keys($array2)); - if ($sort_keys) sort($keys_all, SORT_STRING); - - $result = array(); - foreach($keys_all as $key) { - $isset1 = isset($array1[$key]); - $isset2 = isset($array2[$key]); - if ($isset1 && $isset2) { - // Recurse - $result[$key] = array_merge_leaves($array1[$key], $array2[$key], $sort_keys); - } else if ($isset1) { - $result[$key] = & $array1[$key]; - } else { - $result[$key] = & $array2[$key]; - } - } - return $result; -} - -// An array-leaves to a flat array -function array_flat_leaves($array, $unique = TRUE) -{ - if (! is_array($array)) return $array; - - $tmp = array(); - foreach(array_keys($array) as $key) { - if (is_array($array[$key])) { - // Recurse - foreach(array_flat_leaves($array[$key]) as $_value) { - $tmp[] = $_value; - } - } else { - $tmp[] = & $array[$key]; - } - } - - return $unique ? array_values(array_unique($tmp)) : $tmp; -} - -// $array['something'] => $array['wanted'] -function array_rename_keys(& $array, $keys = array('from' => 'to'), $force = FALSE, $default = '') -{ - if (! is_array($array) || ! is_array($keys)) return FALSE; - - // Nondestructive test - if (! $force) { - foreach(array_keys($keys) as $from) { - if (! isset($array[$from])) { - return FALSE; - } - } - } - - foreach($keys as $from => $to) { - if ($from === $to) continue; - if (! $force || isset($array[$from])) { - $array[$to] = & $array[$from]; - unset($array[$from]); - } else { - $array[$to] = $default; - } - } - - return TRUE; -} - -// Remove redundant values from array() -function array_unique_recursive($array = array()) -{ - if (! is_array($array)) return $array; - - $tmp = array(); - foreach($array as $key => $value){ - if (is_array($value)) { - $array[$key] = array_unique_recursive($value); - } else { - if (isset($tmp[$value])) { - unset($array[$key]); - } else { - $tmp[$value] = TRUE; - } - } - } - - return $array; -} - // --------------------- // Part One : Checker