File indexing completed on 2024-12-22 05:33:09

0001 <?php
0002 
0003 /**
0004  * Flooer Framework
0005  *
0006  * LICENSE: BSD License (2 Clause)
0007  *
0008  * @category    Flooer
0009  * @package     Flooer_Filter
0010  * @author      Akira Ohgaki <akiraohgaki@gmail.com>
0011  * @copyright   Akira Ohgaki
0012  * @license     https://opensource.org/licenses/BSD-2-Clause  BSD License (2 Clause)
0013  * @link        https://github.com/akiraohgaki/flooer
0014  */
0015 
0016 /**
0017  * Usage
0018  *
0019  * $filter = new Flooer_Filter();
0020  * $filter->setEncoding('UTF-8');
0021  * $filter->setNewline('LF');
0022  * $filter->filter($input);
0023  */
0024 
0025 /**
0026  * String filter class
0027  *
0028  * @category    Flooer
0029  * @package     Flooer_Filter
0030  * @author      Akira Ohgaki <akiraohgaki@gmail.com>
0031  */
0032 class Flooer_Filter
0033 {
0034 
0035     /**
0036      * Configuration options
0037      *
0038      * @var     array
0039      */
0040     protected $_config = array(
0041         'convertEncoding' => true,
0042         'convertNewline' => true,
0043         'stripNull' => true,
0044         'stripSlashes' => true,
0045         'trimWhitespace' => true,
0046         'encoding' => 'UTF-8',
0047         'newline' => 'LF'
0048     );
0049 
0050     /**
0051      * Constructor
0052      *
0053      * @param   array $config
0054      * @return  void
0055      */
0056     public function __construct(array $config = null)
0057     {
0058         if ($config) {
0059             $this->_config = $config + $this->_config;
0060         }
0061     }
0062 
0063     /**
0064      * Filtering
0065      *
0066      * @param   mixed &$data
0067      * @return  void
0068      */
0069     public function filter(&$data)
0070     {
0071         // Filter an array/object recursively
0072         if (is_array($data) || is_object($data)) {
0073             if ($this->_config['convertEncoding']) {
0074                 array_walk_recursive($data, array($this, 'convertEncoding'));
0075             }
0076             if ($this->_config['convertNewline']) {
0077                 array_walk_recursive($data, array($this, 'convertNewline'));
0078             }
0079             if ($this->_config['stripNull']) {
0080                 array_walk_recursive($data, array($this, 'stripNull'));
0081             }
0082             if ($this->_config['stripSlashes']) {
0083                 array_walk_recursive($data, array($this, 'stripSlashes'));
0084             }
0085             if ($this->_config['trimWhitespace']) {
0086                 array_walk_recursive($data, array($this, 'trimWhitespace'));
0087             }
0088         }
0089         // Filter a string
0090         else {
0091             if ($this->_config['convertEncoding']) {
0092                 $this->convertEncoding($data);
0093             }
0094             if ($this->_config['convertNewline']) {
0095                 $this->convertNewline($data);
0096             }
0097             if ($this->_config['stripNull']) {
0098                 $this->stripNull($data);
0099             }
0100             if ($this->_config['stripSlashes']) {
0101                 $this->stripSlashes($data);
0102             }
0103             if ($this->_config['trimWhitespace']) {
0104                 $this->trimWhitespace($data);
0105             }
0106         }
0107     }
0108 
0109     /**
0110      * Convert character encoding
0111      *
0112      * @param   string &$value
0113      * @param   mixed $key
0114      * @return  void
0115      */
0116     public function convertEncoding(&$value, $key = null)
0117     {
0118         $value = mb_convert_encoding($value, $this->_config['encoding'], mb_detect_order());
0119     }
0120 
0121     /**
0122      * Convert a newline
0123      *
0124      * @param   string &$value
0125      * @param   mixed $key
0126      * @return  void
0127      */
0128     public function convertNewline(&$value, $key = null)
0129     {
0130         switch (strtoupper($this->_config['newline'])) {
0131             case 'LF':
0132                 $value = str_replace(array("\r\n", "\r"), "\n", $value);
0133                 break;
0134             case 'CRLF':
0135                 $value = str_replace(array("\r\n", "\r"), "\n", $value);
0136                 $value = str_replace("\n", "\r\n", $value);
0137                 break;
0138             case 'CR':
0139                 $value = str_replace(array("\r\n", "\n"), "\r", $value);
0140                 break;
0141             default:
0142                 break;
0143         }
0144     }
0145 
0146     /**
0147      * Strip a null characters
0148      *
0149      * @param   string &$value
0150      * @param   mixed $key
0151      * @return  void
0152      */
0153     public function stripNull(&$value, $key = null)
0154     {
0155         $value = str_replace("\0", '', $value);
0156     }
0157 
0158     /**
0159      * Un-quote a quoted string
0160      *
0161      * @param   string &$value
0162      * @param   mixed $key
0163      * @return  void
0164      */
0165     public function stripSlashes(&$value, $key = null)
0166     {
0167         $value = stripslashes($value);
0168     }
0169 
0170     /**
0171      * Trim whitespace
0172      *
0173      * @param   string &$value
0174      * @param   mixed $key
0175      * @return  void
0176      */
0177     public function trimWhitespace(&$value, $key = null)
0178     {
0179         $value = trim($value);
0180     }
0181 
0182     /**
0183      * Set an executable flag for convertEncoding()
0184      *
0185      * @param   bool $bool
0186      * @return  void
0187      */
0188     public function setConvertEncoding($bool)
0189     {
0190         $this->_config['convertEncoding'] = $bool;
0191     }
0192 
0193     /**
0194      * Get an executable flag for convertEncoding()
0195      *
0196      * @return  bool
0197      */
0198     public function getConvertEncoding()
0199     {
0200         return $this->_config['convertEncoding'];
0201     }
0202 
0203     /**
0204      * Set an executable flag for convertNewline()
0205      *
0206      * @param   bool $bool
0207      * @return  void
0208      */
0209     public function setConvertNewline($bool)
0210     {
0211         $this->_config['convertNewline'] = $bool;
0212     }
0213 
0214     /**
0215      * Get an executable flag for convertNewline()
0216      *
0217      * @return  bool
0218      */
0219     public function getConvertNewline()
0220     {
0221         return $this->_config['convertNewline'];
0222     }
0223 
0224     /**
0225      * Set an executable flag for stripNull()
0226      *
0227      * @param   bool $bool
0228      * @return  void
0229      */
0230     public function setStripNull($bool)
0231     {
0232         $this->_config['stripNull'] = $bool;
0233     }
0234 
0235     /**
0236      * Get an executable flag for stripNull()
0237      *
0238      * @return  bool
0239      */
0240     public function getStripNull()
0241     {
0242         return $this->_config['stripNull'];
0243     }
0244 
0245     /**
0246      * Set an executable flag for stripSlashes()
0247      *
0248      * @param   bool $bool
0249      * @return  void
0250      */
0251     public function setStripSlashes($bool)
0252     {
0253         $this->_config['stripSlashes'] = $bool;
0254     }
0255 
0256     /**
0257      * Get an executable flag for stripSlashes()
0258      *
0259      * @return  bool
0260      */
0261     public function getStripSlashes()
0262     {
0263         return $this->_config['stripSlashes'];
0264     }
0265 
0266     /**
0267      * Set an executable flag for trimWhitespace()
0268      *
0269      * @param   bool $bool
0270      * @return  void
0271      */
0272     public function setTrimWhitespace($bool)
0273     {
0274         $this->_config['trimWhitespace'] = $bool;
0275     }
0276 
0277     /**
0278      * Get an executable flag for trimWhitespace()
0279      *
0280      * @return  bool
0281      */
0282     public function getTrimWhitespace()
0283     {
0284         return $this->_config['trimWhitespace'];
0285     }
0286 
0287     /**
0288      * Set a character encoding
0289      *
0290      * @param   string $encoding Available values to mb_convert_encoding()
0291      * @return  void
0292      */
0293     public function setEncoding($encoding)
0294     {
0295         $this->_config['encoding'] = $encoding;
0296     }
0297 
0298     /**
0299      * Get a character encoding
0300      *
0301      * @return  string
0302      */
0303     public function getEncoding()
0304     {
0305         return $this->_config['encoding'];
0306     }
0307 
0308     /**
0309      * Set a newline
0310      *
0311      * @param   string $newline Available values: LF, CRLF, CR
0312      * @return  void
0313      */
0314     public function setNewline($newline)
0315     {
0316         $this->_config['newline'] = $newline;
0317     }
0318 
0319     /**
0320      * Get a newline
0321      *
0322      * @return  string
0323      */
0324     public function getNewline()
0325     {
0326         return $this->_config['newline'];
0327     }
0328 
0329 }