Server : nginx/1.20.1
System : Linux iZ2ze9ojcl78uluczwag69Z 4.18.0-240.22.1.el8_3.x86_64 #1 SMP Thu Apr 8 19:01:30 UTC 2021 x86_64
User : www ( 1000)
PHP Version : 7.3.28
Disable Function : passthru,exec,system,chroot,chgrp,chown,shell_exec,popen,proc_open,pcntl_exec,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,imap_open,apache_setenv
Directory :  /www/wwwroot/0531yanglao.com/extend/phpTools/
Upload File :
Current Directory [ Writeable ] Root Directory [ Writeable ]


Current File : /www/wwwroot/0531yanglao.com/extend/phpTools/StrFilterTools.php
<?php

header('content-type:text/html;charset=utf-8');

/**
 * 替换敏感字符串工具类
 * Class CharacterTools
 */

/**
 * Func:
 * public  replace            替换非法字符
 * public  check              检查是否含有非法字符
 * private protect_white_list 保护白名单
 * private resume_white_list  还原白名单
 * private getval             白名单 key转为value
 */
class StrFilterTools{

    private $_white_list = array();
    private $_black_list = array();
    private $_replacement = '*';
    private $_LTAG = '[[##';
    private $_RTAG = '##]]';

    /**
     * @param Array  $white_list
     * @param Array  $black_list
     * @param String $replacement
     */
    public function __construct($white_list=array(), $black_list=array(), $replacement='*'){
        $this->_white_list = $white_list;
        $this->_black_list = $black_list;
        $this->_replacement = $replacement;
    }

    /**
     * @desc 替换非法字符
     * @param  String $content 要替換的字符串
     * @return String          替換后的字符串
     */
    public function replace($content){

        if(!isset($content) || $content==''){
            return '';
        }

        // protect white list
        $content = $this->protect_white_list($content);

        // replace black list
        if($this->_black_list){
            foreach($this->_black_list as $val){
                $content = str_replace($val, $this->_replacement, $content);
            }
        }

        // resume white list
        $content = $this->resume_white_list($content);

        return $content;
    }

    /**
     * @desc 检查是否含有非法自符
     * @param  String $content 字符串
     * @return boolean
     */
    public function check($content){

        if(!isset($content) || $content==''){
            return true;
        }

        // protect white list
        $content = $this->protect_white_list($content);

        // check
        if($this->_black_list){
            foreach($this->_black_list as $val){
                if(strstr($content, $val)!=''){
                    return false;
                }
            }
        }

        return true;
    }

    /**
     * @desc 保护白名单
     * @param  String $content 字符串
     * @return String
     */
    private function protect_white_list($content){
        if($this->_white_list){
            foreach($this->_white_list as $key=>$val){
                $content = str_replace($val, $this->_LTAG.$key.$this->_RTAG, $content);
            }
        }
        return $content;
    }

    /**
     * @desc 还原白名单
     * @param  String $content
     * @return String
     */
    private function resume_white_list($content){
        if($this->_white_list){
            $content = preg_replace_callback("/\[\[##(.*?)##\]\].*?/si", array($this, 'getval'), $content);
        }
        return $content;
    }

    /**
     * @desc 白名单 key还原为value
     * @param  Array  $matches 匹配white_list的key
     * @return String white_list val
     */
    private function getval($matches){
        return isset($this->_white_list[$matches[1]])? $this->_white_list[$matches[1]] : ''; // key->val
    }

}

// 使用示例
/* $white = array('屌丝', '曹操');
$black = array('屌', '操');
$content = "我操,曹操你是屌丝,我屌你啊";

$obj = new StrFilterTools($white, $black);
echo $obj->replace($content);  */// 输出:我*,曹操你是屌丝,我*你啊