library NameFilter {
    /**
     * @dev 过滤名称字符串
     * -将大写转换为小写.
     * -确保它不以空格开始/结束
     * -确保它不包含连续的多个空格
     * -不能只是数字
     * -不能以0x开头
     * -将字符限制为A-Z，a-z，0-9和空格。
     * @return 以字节32格式重新处理的字符串
     */
    function nameFilter(string _input)
        internal
        pure
        returns(bytes32)
    {
        bytes memory _temp = bytes(_input);
        uint256 _length = _temp.length;

        //对不起限于32个字符
        require (_length <= 32 && _length > 0, "string must be between 1 and 32 characters");
        // 确保它不以空格开头或以空格结尾
        require(_temp[0] != 0x20 && _temp[_length-1] != 0x20, "string cannot start or end with space");
        // 确保前两个字符不是0x
        if (_temp[0] == 0x30)
        {
            require(_temp[1] != 0x78, "string cannot start with 0x");
            require(_temp[1] != 0x58, "string cannot start with 0X");
        }

        // 创建一个bool来跟踪我们是否有非数字字符
        bool _hasNonNumber;

        // 转换和检查
        for (uint256 i = 0; i < _length; i++)
        {
            // 如果它的大写A-Z
            if (_temp[i] > 0x40 && _temp[i] < 0x5b)
            {
                // 转换为小写a-z
                _temp[i] = byte(uint(_temp[i]) + 32);

                // 我们有一个非数字
                if (_hasNonNumber == false)
                    _hasNonNumber = true;
            } else {
                require
                (
                    // 要求角色是一个空间
                    _temp[i] == 0x20 ||
                    // 或小写a-z
                    (_temp[i] > 0x60 && _temp[i] < 0x7b) ||
                    // 或0-9
                    (_temp[i] > 0x2f && _temp[i] < 0x3a),
                    "string contains invalid characters"
                );
                // 确保连续两行不是空格
                if (_temp[i] == 0x20)
                    require( _temp[i+1] != 0x20, "string cannot contain consecutive spaces");

                // 看看我们是否有一个数字以外的字符
                if (_hasNonNumber == false && (_temp[i] < 0x30 || _temp[i] > 0x39))
                    _hasNonNumber = true;
            }
        }

        require(_hasNonNumber == true, "string cannot be only numbers");

        bytes32 _ret;
        assembly {
            _ret := mload(add(_temp, 32))
        }
        return (_ret);
    }
}
function nameFilter(string _input)
    internal
    pure
    returns(bytes32)
{
    bytes memory _temp = bytes(_input);
    uint256 _length = _temp.length;

    //对不起限于32个字符
    require (_length <= 32 && _length > 0, "string must be between 1 and 32 characters");
    // 确保它不以空格开头或以空格结尾
    require(_temp[0] != 0x20 && _temp[_length-1] != 0x20, "string cannot start or end with space");
    // 确保前两个字符不是0x
    if (_temp[0] == 0x30)
    {
        require(_temp[1] != 0x78, "string cannot start with 0x");
        require(_temp[1] != 0x58, "string cannot start with 0X");
    }

    // 创建一个bool来跟踪我们是否有非数字字符
    bool _hasNonNumber;

    // 转换和检查
    for (uint256 i = 0; i < _length; i++)
    {
        // 如果它的大写A-Z
        if (_temp[i] > 0x40 && _temp[i] < 0x5b)
        {
            // 转换为小写a-z
            _temp[i] = byte(uint(_temp[i]) + 32);

            // 我们有一个非数字
            if (_hasNonNumber == false)
                _hasNonNumber = true;
        } else {
            require
            (
                // 要求角色是一个空间
                _temp[i] == 0x20 ||
                // 或小写a-z
                (_temp[i] > 0x60 && _temp[i] < 0x7b) ||
                // 或0-9
                (_temp[i] > 0x2f && _temp[i] < 0x3a),
                "string contains invalid characters"
            );
            // 确保连续两行不是空格
            if (_temp[i] == 0x20)
                require( _temp[i+1] != 0x20, "string cannot contain consecutive spaces");

            // 看看我们是否有一个数字以外的字符
            if (_hasNonNumber == false && (_temp[i] < 0x30 || _temp[i] > 0x39))
                _hasNonNumber = true;
        }
    }

    require(_hasNonNumber == true, "string cannot be only numbers");

    bytes32 _ret;
    assembly {
        _ret := mload(add(_temp, 32))
    }
    return (_ret);
}

/**
 * @dev 过滤名称字符串
 * -将大写转换为小写.
 * -确保它不以空格开始/结束
 * -确保它不包含连续的多个空格
 * -不能只是数字
 * -不能以0x开头
 * -将字符限制为A-Z，a-z，0-9和空格。
 * @return 以字节32格式重新处理的字符串
 */