Created
June 24, 2012 06:14
-
-
Save englishextra/2981888 to your computer and use it in GitHub Desktop.
General purpose PHP class to work with strings and files
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* shimansky.biz | |
* | |
* Static web site core scripts | |
* @package shimansky.biz | |
* @author Serguei Shimansky <[email protected]> | |
* @copyright Serguei Shimansky 10:07 24.06.2012 | |
* @access public | |
* @version 0.2 | |
* @link https://bitbucket.org/englishextra/shimansky.biz | |
* @link https://github.com/englishextra/shimansky.biz.git | |
* @link https://gist.github.com/2981888 | |
* @link http://pastebin.com/y2Gs4bzE | |
*/ | |
class Swamper { | |
/** | |
* There is a difference between the two: If you write an empty __construct() function, you overwrite any inherited __construct() from a parent class. | |
* So if you don't need it and you do not want to overwrite the parent constructor explicitly, don't write it at all. | |
*/ | |
function __construct() { | |
} | |
public function is_utf8($s) { | |
// From http://w3.org/International/questions/qa-forms-utf-8.html | |
return preg_match('%^(?: | |
[\x09\x0A\x0D\x20-\x7E] # ASCII | |
| [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte | |
| \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs | |
| [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte | |
| \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates | |
| \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3 | |
| [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15 | |
| \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16 | |
)*$%xs', $s); | |
} | |
public function safe_str($s) { | |
return str_replace(array("\n", "\r", "\t", "\v", "\0", "\x0B"), '', preg_replace("/[^\x20-\xFF]/", "", trim(@strval($s)))); | |
} | |
public function get_post($s, $v = '') { | |
if (isset ($_GET[$s]) || isset ($_POST[$s])) { | |
$v = isset ($_GET[$s]) ? $_GET[$s] : $_POST[$s]; | |
if (is_array($v)) { | |
foreach ($v as &$v1) { | |
$v1 = urldecode($v1); | |
$v1 = strtr($v1, array_flip(get_html_translation_table(HTML_ENTITIES))); | |
$v1 = trim($v1); | |
$v1 = $this->safe_str($v1); | |
} | |
unset($v1); | |
} else { | |
$v = urldecode($v); | |
$v = strtr($v, array_flip(get_html_translation_table(HTML_ENTITIES))); | |
$v = trim($v); | |
$v = $this->safe_str($v); | |
} | |
} | |
return $v; | |
} | |
public function fix_str_for_js($s) { | |
$s = str_replace("'", '\'', $s); | |
return $s; | |
} | |
public function js_unescape($s) { | |
return preg_replace('/\\\u([0-9a-f]{4})/ie', "chr(hexdec('\\1'))", $s); | |
} | |
public function ensure_amp($s) { | |
$s = str_replace('&', '&', $s); | |
$s = str_replace(array('&amp;', '&#'), array('&', '&#'), $s); | |
$s = preg_replace("/(\&\;)([a-z0-9]+)(\;)/ei", "'&'.('\\2').';'", $s); | |
$s = preg_replace("/(\&\#)([a-z0-9]+)(\;)/ei", "'&#'.('\\2').';'", $s); | |
return $s; | |
} | |
public function ensure_lt_gt($s) { | |
$s = str_replace('<', '<', $s); | |
$s = str_replace('>', '>', $s); | |
$s = str_replace(array('&lt;', '&gt;'), array('<', '>'), $s); | |
return $s; | |
} | |
public function cut_last_160_160($s) { | |
$s = preg_replace("/\&\#160\;\&\#160\; \r\n$/", '', $s); | |
$s = preg_replace("/\&\#160\;\&\#160\; \n$/", '', $s); | |
return $s; | |
} | |
public function cut_last_160_183($s) { | |
$s = preg_replace("/\&\#160\;\&\#183\; \r\n$/", '', $s); | |
$s = preg_replace("/\&\#160\;\&\#183\; \n$/", '', $s); | |
return $s; | |
} | |
public function cut_last_br($s) { | |
$s = preg_replace("/\<br \/\>\r\n$/i", '', $s); | |
$s = preg_replace("/\<br \/\>\n$/i", '', $s); | |
return $s; | |
} | |
public function ord_space($s) { | |
return trim(preg_replace("/[\ ]+/", " ", $s)); | |
} | |
public function ord_underscore($s) { | |
return trim(preg_replace("/[\_]+/", "_", $s)); | |
} | |
public function ord_hypher($s) { | |
return trim(preg_replace("/[\-]+/", "-", $s)); | |
} | |
public function remove_tags($s) { | |
$s = stripslashes($s); | |
$s = preg_replace("'<script[^>]*?>.*?</script>'si", ' ', $s); | |
$s = preg_replace("'<style[^>]*?>.*?</style>'si", ' ', $s); | |
$s = preg_replace("'<[\/\!]*?[^<>]*?>'si", ' ', $s); | |
$s = $this->ord_space($s); | |
return $s; | |
} | |
public function remove_ents($s) { | |
$s = preg_replace("/(\&)([A-Za-z0-9\#]+)(\;)/ei", "' '", $s); | |
return $s; | |
} | |
public function remove_comments($s) { | |
$s = preg_replace("/(\<!--)(.*?)(-->)/ie", "", $s); | |
return $s; | |
} | |
public function has_http($s, $r = false) { | |
if (preg_match("/^(http|https|ftp)\:\/\//", $s) && | |
!preg_match("/^\//", $s)) { | |
return $r = true; | |
} | |
} | |
public function is_ip($ip) { | |
//first of all the format of the ip address is matched | |
if(preg_match("/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/",$ip)) { | |
//now all the intger values are separated | |
$parts=explode(".",$ip); | |
//now we need to check each part can range from 0-255 | |
foreach($parts as $ip_parts) { | |
if(intval($ip_parts)>255 || intval($ip_parts)<0) { | |
return false; //if number is not within range of 0-255 | |
} | |
} | |
return true; | |
} else { | |
return false; //if format of ip address doesn't matches | |
} | |
} | |
public function write_file($data, $w, $type) { | |
if (!$fo = fopen($data, $type)) { | |
die('Cannot open file: ' . $data); | |
} | |
if (!is_writable($data)) { | |
die('Cannot write file: ' . $data); | |
} | |
flock($fo, LOCK_EX); | |
fputs($fo, $w); | |
fflush($fo); | |
flock($fo, LOCK_UN); | |
fclose($fo); | |
} | |
public function clear_data($data) { | |
$w = ''; | |
if (!file_exists($data) || !$fo = fopen($data, "w+")) { | |
die('Cannot open file: ' . $data); | |
} | |
flock($fo, LOCK_EX); | |
fputs($fo, $w); | |
fflush($fo); | |
flock($fo, LOCK_UN); | |
fclose($fo); | |
} | |
public function remove_dir_content($dirname = '.') { | |
if (is_dir($dirname)) { | |
echo '<strong>' . $dirname . '</strong> is a directory.<br />'; | |
if ($handle = @opendir($dirname)) { | |
while (($file = readdir($handle)) !== false) { | |
if ($file != "." && $file != "..") { | |
echo '<strong>' . $file . '</strong> deleted<br />'; | |
$fullpath = $dirname . '/' . $file; | |
if (is_dir($fullpath)) { | |
$this->remove_dir_content($fullpath); | |
@rmdir($fullpath); | |
} else { | |
@unlink($fullpath); | |
} | |
} | |
} | |
closedir($handle); | |
} | |
} | |
} | |
public function remove_bbcoded($s) { | |
$a = array( | |
'(\[img\])(.*?)(\[\/img\])' => '', | |
'(\[img\=left\])(.*?)(\[\/img\])' => '', | |
'(\[img\=right\])(.*?)(\[\/img\])' => '', | |
'(\[color\=[a-zA-Z0-9\#]+\])(.*?)(\[\/color\])' => '', | |
'(\[)(.*?)(\])' => '' | |
); | |
foreach($a as $k => $v) { | |
$s = preg_replace("/${k}/", $v, $s); | |
} | |
return $s; | |
} | |
public function clean_title($s) { | |
$s = str_replace(' ', ' ', $s); | |
$s = str_replace(' ', ' ', $s); | |
$s = str_replace('\'', ''', $s); | |
$s = str_replace('№', '№', $s); | |
$s = str_replace('“', '«;', $s); | |
$s = str_replace('”', '»', $s); | |
$s = str_replace('—', '—', $s); | |
$s = $this->remove_tags($s); | |
$s = $this->ensure_lt_gt($s); | |
$s = str_replace(array("\n", "\r", "\t", "\v", "\0", "\x0B"), '', preg_replace("/[^\x20-\xFF]/", " ", trim(@strval($s)))); | |
$s = $this->ord_space($s); | |
$s = $this->ensure_amp($s); | |
return $s; | |
} | |
public function clean_xhtml($s) { | |
$s = strval($s); | |
$a = array( | |
'¦' => '¦', | |
'§' => '§', | |
'©' => '©', | |
'«' => '«', | |
'®' => '®', | |
'°' => '°', | |
'±' => '±', | |
'·' => '·', | |
'»' => '»', | |
'Ё' => 'Е', | |
'е' => 'е', | |
'—' => '—', | |
'‘' => '‘', | |
'’' => '’', | |
'“' => '“', | |
'“' => '«;', | |
'”' => '”', | |
'”' => '»', | |
'„' => '„', | |
'•' => '•', | |
'‰' => '%', | |
'№' => '№', | |
'™' => '™', | |
'\'' => ''', | |
'`' => ''', | |
' & ' => ' & ', | |
'•' => '•', | |
'¢' => '¢', | |
'©' => '©', | |
'↓' => '↓', | |
'é' => 'é', | |
'€' => '€', | |
'¡' => '¡', | |
'«' => '«', | |
'“' => '“', | |
'—' => '—', | |
'·' => '·', | |
' ' => ' ', | |
'£' => '£', | |
'»' => '»', | |
'”' => '”', | |
'®' => '®', | |
'™' => '™', | |
'¥' => '¥', | |
'(c)' => '©', | |
'NN' => '№' | |
); | |
foreach ($a as $k => $v) { | |
$s = str_replace($k, $v, $s); | |
} | |
$s = preg_replace("/[\ ]+/s", ' ', $s); | |
$s = preg_replace("/[\n]+/s", "\n", $s); | |
return $s; | |
} | |
public function html_to_safe_str($s, $length) { | |
$s = str_replace(array("\n", "\r", "\t", "\v", "\0", "\x0B"), '', preg_replace("/[^\x20-\xFF]/", " ", trim(@strval($s)))); | |
$s = $this->clean_xhtml($s); | |
$s = str_replace(array("–","—","«","»"), array("-","—","«","»"), $s); | |
$s = $this->remove_ents($s); | |
$s = $this->remove_tags($s); | |
$s = $this->ensure_lt_gt($s); | |
$s = $this->ord_space($s); | |
if (!empty($length) && (mb_strlen($s, mb_detect_encoding($s)) > $length)) { | |
$s = mb_substr($s, 0, ($length - 5), mb_detect_encoding($s)) . ' [...]'; | |
} | |
$s = $this->ensure_amp($s); | |
return $s; | |
} | |
public function random_anchor() { | |
$r = range(0, 9); | |
shuffle($r); | |
$ds = ''; | |
foreach ($r as $d) { | |
$ds .= $d; | |
} | |
return $ds; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment