字符文本操作类

using  System;
using  System.Collections;
using  System.Text;
using  System.Text.RegularExpressions;
using  System.Security.Cryptography;

////
///功能:字符文本操作类
///程序:寻梦E
///
///
////


namespace  EmanUtils
{
    
/// <summary>
    
/// 字符串帮助类
    
/// </summary>

    public class StringHelper
    
{
        
/// <summary>
        
/// 构造函数
        
/// </summary>

        public StringHelper()
        
{

        }


        
public static bool IsContains(string[] strs, string value)
        
{
            
if (strs == null)
            
{
                
return false;
            }


            
foreach (string str in strs)
            
{
                
if (str == value)
                
{
                    
return true;
                }

            }


            
return false;
        }




        
#region 字符串过滤

        
对字符串进行HTML编码,针对(input,Textarea)输入时过滤脚本及HTML编码
        
public static string EncodeToHtml(string source)
        
{
            source 
= source.Trim();            
            source 
= source.Replace("'","''");
            source 
= source.Replace("//","");
            source 
= System.Web.HttpContext.Current.Server.HtmlEncode(source);
            source 
= source.Replace("/r/n","<br>");
            source 
= source.Replace("/n","<br>");
            
return source;
        }



        
[否决的]对字符串进行HTML编码,针对(input,Textarea)输入时过滤脚本及HTML编码
        
public static string HtmlFilterForInput(string source)
        
{
            
return EncodeToHtml(source);
        }



        
还原HTML编码为字符串,还原HTML编码为字符串,用于返回到input或 Textarea 输入框
        
public static string DecodeFormHtml(string source)
        
{                                                    
            source 
= source.Trim();                                
            source 
= source.Replace("<br>","/r/n");                
            source 
= source.Replace("<br>","/n");                    
            source    
= System.Web.HttpContext.Current.Server.HtmlDecode(source);               
            
return source;                                      
        }



        
[否决的]还原HTML编码为字符串,还原HTML编码为字符串,用于返回到input或 Textarea 输入框
        
public static string DeHtmlFilterForInput(string source)
        
{
            source 
= source.Trim();                                
            source 
= source.Replace("<br>","/r/n");                
            source 
= source.Replace("<br>","/n");                    
            source    
= System.Web.HttpContext.Current.Server.HtmlDecode(source);               
            
return source;
        }



        
检验用户提交的URL参数字符里面是否有非法字符


        
过滤 Sql 语句字符串中的注入脚本    
        
public static string FilterSql(string source)
        
{
            
//单引号替换成两个单引号
            source = source.Replace("'","''");

            
//半角封号替换为全角封号,防止多语句执行
            source = source.Replace(";","");

            
//半角括号替换为全角括号
            source = source.Replace("(","");
            source 
= source.Replace(")","");

            
///要用正则表达式替换,防止字母大小写得情况////

            
//去除执行存储过程的命令关键字
            source = source.Replace("Exec","");
            source 
= source.Replace("Execute","");

            
//去除系统存储过程或扩展存储过程关键字
            source = source.Replace("xp_","x p_");
            source 
= source.Replace("sp_","s p_");

            
//防止16进制注入
            source = source.Replace("0x","0 x");

            
return source;
        }



        
[否决的]过滤 Sql 语句字符串中的注入脚本    
        
public static string SqlFilter(string source)
        
{
            
return FilterSql(source);
        }


            
        
过滤字符串只剩数字    
        
public static string FilterToNumber(string source)
        
{
            source 
=  Regex.Replace (source,"[^0-9]*","",System.Text.RegularExpressions.RegexOptions.IgnoreCase );            
            
return source;
        }



        
[否决的]过滤字符串只剩数字    
        
public static string NumberFilter(string source)
        
{
            source 
=  Regex.Replace (source,"[^0-9]*","",System.Text.RegularExpressions.RegexOptions.IgnoreCase );            
            
return source;
        }



        
去除数组内重复元素
        
public ArrayList FilterRepeatArrayItem(ArrayList arr)
        
{
            
//建立新数组
            ArrayList newArr = new ArrayList();
            
            
//载入第一个原数组元素
            if(arr.Count>0)
            
{
                newArr.Add(arr[
0]);
            }


            
//循环比较
            for(int i=0;i<arr.Count;i++)
            
{
                
if(!newArr.Contains(arr[i]))
                
{
                    newArr.Add(arr[i]);
                }
                    
            }

            
return newArr;
        }



        
在最后去除指定的字符    
        
public static string CutLastString(string source, string cutString)
        
{
            
string result ="";
            
int tempIndex=0;

            tempIndex 
= source.LastIndexOf(cutString);
            
if(cutString.Length==(source.Length-tempIndex))
            
{
                result 
= source.Substring(0,tempIndex);
            }

            
else
            
{
                result 
= source;
            }

                    
            
return result;
        }



        
利用正则表达式实现UBB代码转换为html代码
        
public static string UBBCode(string source)
        
{
            
if(source==null || source.Length==0)
            
{
                
return "";
            }

                
            source
=source.Replace("&nbsp;","");
            
//source=source.Replace("<","&lt");
            
//source=source.Replace(">","&gt");
            source=source.Replace("/n","<br>");
            source 
= Regex.Replace(source,@"/[url=(?<x>[^/]]*)/](?<y>[^/]]*)/[/url/]",@"<a href=$1 target=_blank>$2</a>",RegexOptions.IgnoreCase);
            source 
= Regex.Replace(source,@"/[url/](?<x>[^/]]*)/[/url/]",@"<a href=$1 target=_blank>$1</a>",RegexOptions.IgnoreCase);
            source 
= Regex.Replace(source,@"/[email=(?<x>[^/]]*)/](?<y>[^/]]*)/[/email/]",@"<a href=$1>$2</a>",RegexOptions.IgnoreCase);
            source 
= Regex.Replace(source,@"/[email/](?<x>[^/]]*)/[/email/]",@"<a href=$1>$1</a>",RegexOptions.IgnoreCase);
            source 
= Regex.Replace(source,@"/[flash](?<x>[^/]]*)/[/flash]",@"<OBJECT codeBase=http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=4,0,2,0 classid=clsid:D27CDB6E-AE6D-11cf-96B8-444553540000 width=500 height=400><PARAM NAME=movie VALUE=""$1""><PARAM NAME=quality VALUE=high><embed src=""$1"" quality=high pluginspage='http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash' type='application/x-shockwave-flash' width=500 height=400>$1</embed></OBJECT>",RegexOptions.IgnoreCase);
            source 
= Regex.Replace(source,@"/",@"<IMG src=""$1"" border=0>",RegexOptions.IgnoreCase);
            source 
= Regex.Replace(source,@"/[color=(?<x>[^/]]*)/](?<y>[^/]]*)/[/color/]",@"<font color=$1>$2</font>",RegexOptions.IgnoreCase);
            source 
= Regex.Replace(source,@"/[face=(?<x>[^/]]*)/](?<y>[^/]]*)/[/face/]",@"<font face=$1>$2</font>",RegexOptions.IgnoreCase);
            source 
= Regex.Replace(source,@"/[size=1/](?<x>[^/]]*)/[/size/]",@"<font size=1>$1</font>",RegexOptions.IgnoreCase);
            source 
= Regex.Replace(source,@"/[size=2/](?<x>[^/]]*)/[/size/]",@"<font size=2>$1</font>",RegexOptions.IgnoreCase);
            source 
= Regex.Replace(source,@"/[size=3/](?<x>[^/]]*)/[/size/]",@"<font size=3>$1</font>",RegexOptions.IgnoreCase);
            source 
= Regex.Replace(source,@"/[size=4/](?<x>[^/]]*)/[/size/]",@"<font size=4>$1</font>",RegexOptions.IgnoreCase);
            source 
= Regex.Replace(source,@"/[size=5/](?<x>[^/]]*)/[/size/]",@"<font size=5>$1</font>",RegexOptions.IgnoreCase);
            source 
= Regex.Replace(source,@"/[size=6/](?<x>[^/]]*)/[/size/]",@"<font size=6>$1</font>",RegexOptions.IgnoreCase);
            source 
= Regex.Replace(source,@"/[align=(?<x>[^/]]*)/](?<y>[^/]]*)/[/align/]",@"<align=$1>$2</align>",RegexOptions.IgnoreCase);
            source 
= Regex.Replace(source,@"/[fly](?<x>[^/]]*)/[/fly]",@"<marquee width=90% behavior=alternate scrollamount=3>$1</marquee>",RegexOptions.IgnoreCase);
            source 
= Regex.Replace(source,@"/[move](?<x>[^/]]*)/[/move]",@"<marquee scrollamount=3>$1</marquee>",RegexOptions.IgnoreCase);
            source 
= Regex.Replace(source,@"/[glow=(?<x>[^/]]*),(?<y>[^/]]*),(?<z>[^/]]*)/](?<w>[^/]]*)/[/glow/]",@"<table width=$1 style='filter:glow(color=$2, strength=$3)'>$4</table>",RegexOptions.IgnoreCase);
            source 
= Regex.Replace(source,@"/[shadow=(?<x>[^/]]*),(?<y>[^/]]*),(?<z>[^/]]*)/](?<w>[^/]]*)/[/shadow/]",@"<table width=$1 style='filter:shadow(color=$2, strength=$3)'>$4</table>",RegexOptions.IgnoreCase);
            source 
= Regex.Replace(source,@"/[center/](?<x>[^/]]*)/[/center/]",@"<center>$1</center>",RegexOptions.IgnoreCase);
            source 
= Regex.Replace(source,@"/[b/](?<x>[^/]]*)/[/b/]",@"<b>$1</b>",RegexOptions.IgnoreCase);
            source 
= Regex.Replace(source,@"/[i/](?<x>[^/]]*)/[/i/]",@"<i>$1</i>",RegexOptions.IgnoreCase);
            source 
= Regex.Replace(source,@"/[u/](?<x>[^/]]*)/[/u/]",@"<u>$1</u>",RegexOptions.IgnoreCase);
            source 
= Regex.Replace(source,@"/[code/](?<x>[^/]]*)/[/code/]",@"<pre id=code><font size=1 face='Verdana, Arial' id=code>$1</font id=code></pre id=code>",RegexOptions.IgnoreCase);
            source 
= Regex.Replace(source,@"/[list/](?<x>[^/]]*)/[/list/]",@"<ul>$1</ul>",RegexOptions.IgnoreCase);
            source 
= Regex.Replace(source,@"/[list=1/](?<x>[^/]]*)/[/list/]",@"<ol type=1>$1</ol id=1>",RegexOptions.IgnoreCase);
            source 
= Regex.Replace(source,@"/[list=a/](?<x>[^/]]*)/[/list/]",@"<ol type=a>$1</ol id=a>",RegexOptions.IgnoreCase);
            source 
= Regex.Replace(source,@"/[/*/](?<x>[^/]]*)/[//*/]",@"<li>$1</li>",RegexOptions.IgnoreCase);
            source 
= Regex.Replace(source,@"/[quote](?<x>.*)/[/quote]",@"<center>—— 以下是引用 ——<table border='1' width='80%' cellpadding='10' cellspacing='0' ><tr><td>$1</td></tr></table></center>",RegexOptions.IgnoreCase);
            source 
= Regex.Replace(source,@"/[QT=*([0-9]*),*([0-9]*)/](.[^/[]*)/[//QT]",@"<embed src=$3 width=$1 height=$2 autoplay=true loop=false controller=true playeveryframe=false cache=false scale=TOFIT bgcolor=#000000 kioskmode=false targetcache=false pluginspage=http://www.apple.com/quicktime/>",RegexOptions.IgnoreCase);
            source 
= Regex.Replace(source,@"/[MP=*([0-9]*),*([0-9]*)/](.[^/[]*)/[//MP]",@"<object align=middle classid=CLSID:22d6f312-b0f6-11d0-94ab-0080c74c7e95 class=OBJECT id=MediaPlayer width=$1 height=$2 ><param name=ShowStatusBar value=-1><param name=Filename value=$3><embed type=application/x-oleobject codebase=http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701 flename=mp src=$3 width=$1 height=$2></embed></object>",RegexOptions.IgnoreCase);
            source 
= Regex.Replace(source,@"/[RM=*([0-9]*),*([0-9]*)/](.[^/[]*)/[//RM]",@"<OBJECT classid=clsid:CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA class=OBJECT id=RAOCX width=$1 height=$2><PARAM NAME=SRC VALUE=$3><PARAM NAME=CONSOLE VALUE=Clip1><PARAM NAME=CONTROLS VALUE=imagewindow><PARAM NAME=AUTOSTART VALUE=true></OBJECT><br><OBJECT classid=CLSID:CFCDAA03-8BE4-11CF-B84B-0020AFBBCCFA height=32 id=video2 width=$1><PARAM NAME=SRC VALUE=$3><PARAM NAME=AUTOSTART VALUE=-1><PARAM NAME=CONTROLS VALUE=controlpanel><PARAM NAME=CONSOLE VALUE=Clip1></OBJECT>",RegexOptions.IgnoreCase);
            
return(source);    
        }

            

        
整理(过滤)以英文逗号分割的字符串
        
public static string FilterStringArray(string source,string str2)
        
{
            source 
= source.Replace(str2,"");
            
if(source!="")
            
{
                source 
= source.Replace(",,",",");

                
if(source[0].ToString()==",")
                
{
                    source 
= source.Substring(1,source.Length-1);
                }


                
if(source[source.Length-1].ToString()==",")
                
{
                    source 
= source.Substring(0,source.Length-1);
                }

            }

            
return source;
        }



        
#endregion


        
#region 字符串组合

        
#region 返回年月日时分秒组合的字符串
        
/// <summary>
        
/// 返回年月日时分秒组合的字符串,如:20050424143012 (2005年4月24日14点30分12秒)
        
/// </summary>
        
/// <param name="splitString">中间间隔的字符串,如2005/04/24/14/30/12。可以用来建立目录时使用</param>
        
/// <returns></returns>

        #endregion

        
public static string GetTimeString(string splitString)
        
{
            DateTime now 
= DateTime.Now;

            StringBuilder sb 
= new StringBuilder();
            sb.Append(now.Year.ToString(
"0000"));
            sb.Append(splitString);
            sb.Append(now.Month.ToString(
"00"));
            sb.Append(splitString);
            sb.Append(now.Day.ToString(
"00"));
            sb.Append(splitString);
            sb.Append(now.Hour.ToString(
"00"));
            sb.Append(splitString);
            sb.Append(now.Minute.ToString(
"00"));
            sb.Append(splitString);
            sb.Append(now.Second.ToString(
"00"));
            
            
return sb.ToString();
        }



        
返回年月日时分秒组合的字符串
        
public static string GetDateString(string splitString)
        
{
            DateTime now 
= DateTime.Now;

            StringBuilder sb 
= new StringBuilder();
            sb.Append(now.Year.ToString(
"0000"));
            sb.Append(splitString);
            sb.Append(now.Month.ToString(
"00"));
            sb.Append(splitString);
            sb.Append(now.Day.ToString(
"00"));
            
            
return sb.ToString();
        }



        
#endregion


        
#region 随机字符串,随机数

        
private static string _LowerChar = "abcdefghijklmnopqrstuvwxyz";
        
private static string _UpperChar = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        
private static string _NumberChar = "0123456789";

        
#region 获取种子
        
/// <summary>
        
/// 使用RNGCryptoServiceProvider 做种,可以在一秒内产生的随机数重复率非常
        
/// 的低,对于以往使用时间做种的方法是个升级
        
/// </summary>
        
/// <returns></returns>

        #endregion

        
public static int GetNewSeed()
        
{
            
byte[] rndBytes = new byte[4];
            RNGCryptoServiceProvider rng 
= new RNGCryptoServiceProvider();
            rng.GetBytes(rndBytes);
            
return BitConverter.ToInt32(rndBytes,0);
        }



        
取得指定范围内的数字随几数
        
public static int GetRandomNumber(int startNumber, int endNumber)
        
{
            Random objRandom 
= new Random(GetNewSeed());
            
int r = objRandom.Next(startNumber,endNumber);
            
return r;
        }



        
获取指定 ASCII 范围内的随机字符串
        
public static string GetRandomStringByASCII(int resultLength,int startNumber, int endNumber) 
        
{
            System.Random objRandom 
= new System.Random(GetNewSeed());
            
string result = null;
            
for(int i=0; i<resultLength; i++
            
{
                result 
+= (char)objRandom.Next(startNumber, endNumber);
            }

            
return result;
        }


        
        
从指定字符串中抽取指定长度的随机字符串
        
private static string GetRandomString(string source,int resultLength) 
        
{
            System.Random objRandom 
= new System.Random(GetNewSeed()); 
            
string result = null;
            
for(int i=0; i<resultLength; i++
            
{
                result 
+= source.Substring(objRandom.Next(0,source.Length-1),1);
            }

            
return result;
        }


        
        
获取指定长度随机的数字字符串
        
public static string GetRandomNumberString(int resultLength) 
        
{
            
return GetRandomString(_NumberChar,resultLength);
        }



        
获取指定长度随机的字母字符串(包含大小写字母)
        
public static string GetRandomLetterString(int resultLength) 
        
{
            
return GetRandomString(_LowerChar + _UpperChar, resultLength);
        }



        
获取指定长度随机的字母+数字混和字符串(包含大小写字母)
        
public static string GetRandomMixString(int resultLength) 
        
{
            
return GetRandomString(_LowerChar + _UpperChar + _NumberChar, resultLength);
        }

  
        
#endregion
 

        
字符串验证 

        
#region 字符串截取

        
获取字符串的实际长度(按单字节)
        
public static int GetRealLength(string source)
        
{
            
return System.Text.Encoding.Default.GetByteCount(source);
        }



        
取得固定长度的字符串(按单字节截取)
        
public static string SubString(string source, int resultLength)
        
{

            
//判断字符串长度是否大于截断长度
            if(System.Text.Encoding.Default.GetByteCount(source) > resultLength)
            
{
                
//判断字串是否为空
                if(source == null)
                
{
                    
return "";
                }


                
//初始化
                int i = 0, j = 0;

                
//为汉字或全脚符号长度加2否则加1
                foreach (char newChar in source)
                
{
                    
if ((int)newChar > 127)
                    
{
                        i 
+= 2;
                    }

                    
else
                    
{
                        i 
++;
                    }

                    
if (i > resultLength)
                    
{
                        source 
= source.Substring(0, j) ;
                        
break;
                    }

                    j 
++;
                }

            }

            
return source;
        }

        

        
按长度分割字符串
        
private ArrayList SplitStringByLength(string str,int len)
        
{
            ArrayList arrBlock 
= new ArrayList();
            
int intBlockCount = str.Length/len;
            
if(str.Length%len!=0)
            
{
                
for(int i=0;i<=intBlockCount;i++)
                
{
                    
if((str.Length-i*len) > len)
                        arrBlock.Add(str.Substring(i
*len,len));
                    
else
                        arrBlock.Add(str.Substring(i
*len,(str.Length%len)));
                }

            }

            
else
            
{
                
for(int i=0;i<intBlockCount;i++)
                
{
                    arrBlock.Add(str.Substring(i
*len,len));
                }

            }
   
            
return arrBlock;
        }

        

        
#endregion


        
#region 字符串比较

        
/// <summary>
        
///  获得某个字符串在另个字符串中出现的次数
        
/// </summary>
        
/// <param name="strOriginal">要处理的字符</param>
        
/// <param name="strSymbol">符号</param>
        
/// <returns>返回值</returns>

        public static int GetStringIncludeCount(string strOriginal,string strSymbol)
        
{
            
            
int count=0;
            count 
= strOriginal.Length - strOriginal.Replace(strSymbol, String.Empty).Length;
            
return count;
        }


        
/// <summary>
        
/// 获得某个字符串在另个字符串第一次出现时前面所有字符
        
/// </summary>
        
/// <param name="strOriginal">要处理的字符</param>
        
/// <param name="strSymbol">符号</param>
        
/// <returns>返回值</returns>

        public static string GetFirstString(string strOriginal,string strSymbol)
        
{
            
int strPlace=strOriginal.IndexOf(strSymbol);
            
if (strPlace!=-1)
            
{
                strOriginal
=strOriginal.Substring(0,strPlace);
            }

            
return strOriginal;
        }


        
/// <summary>
        
/// 获得某个字符串在另个字符串最后一次出现时后面所有字符
        
/// </summary>
        
/// <param name="strOriginal">要处理的字符</param>
        
/// <param name="strSymbol">符号</param>
        
/// <returns>返回值</returns>

        public static string GetLastString(string strOriginal,string strSymbol)
        
{
            
int strPlace=strOriginal.LastIndexOf(strSymbol)+strSymbol.Length;
            strOriginal
=strOriginal.Substring(strPlace);
            
return strOriginal;
        }


        
/// <summary>
        
/// 获得两个字符之间第一次出现时前面所有字符
        
/// </summary>
        
/// <param name="strOriginal">要处理的字符</param>
        
/// <param name="strFirst">最前哪个字符</param>
        
/// <param name="strLast">最后哪个字符</param>
        
/// <returns>返回值</returns>

        public static string GetTwoMiddleFirstStr(string strOriginal,string strFirst,string strLast)
        
{
            strOriginal
=GetFirstString(strOriginal,strLast);
            strOriginal
=GetLastString(strOriginal,strFirst);
            
return strOriginal;
        }


        
/// <summary>
        
///  获得两个字符之间最后一次出现时的所有字符
        
/// </summary>
        
/// <param name="strOriginal">要处理的字符</param>
        
/// <param name="strFirst">最前哪个字符</param>
        
/// <param name="strLast">最后哪个字符</param>
        
/// <returns>返回值</returns>

        public static string GetTwoMiddleLastStr(string strOriginal,string strFirst,string strLast)
        
{
            strOriginal
=GetLastString(strOriginal,strFirst);
            strOriginal
=GetFirstString(strOriginal,strLast);
            
return strOriginal;
        }


        
/// <summary>
        
/// 发帖过滤词(用“|”号分隔)Application["app_state_FilterWord"]
        
/// </summary>
        
/// <param name="str">字符串</param>
        
/// <param name="chkword">过滤词(用“|”号分隔)</param>

        public static bool CheckBadWords(string str,string chkword)
        
{
            
if( chkword!=null && chkword!="" )
            
{
                
string filter = chkword;
                
string chk1="";
                
string[] aryfilter = filter.Split('|');
                
for(int i=0;i<aryfilter.Length;i++)
                
{
                    chk1 
= aryfilter[i].ToString();
                    
if( str.IndexOf(chk1)>=0 )
                        
return true;
                }

            }

            
return false;
        }


        
/// <summary>
        
/// 发帖过滤字(需审核)(不同组间用“§”号分隔,同组内用“,”分隔)Application["app_state_Check_FilterWord"]
        
/// </summary>
        
/// <param name="str">字符串</param>
        
/// <param name="chkword">过滤字(需审核)(不同组间用“§”号分隔,同组内用“,”分隔)</param>

        public static bool CheckilterStr(string str,string chkword)
        
{
            
            
if( chkword!=null && chkword!="" )
            
{
                
string filter = chkword;
                
string[] aryfilter = filter.Split('§');
                
string[] aryfilter_lei;
                
int lei_for=0,j;

                
for(int i=0;i<aryfilter.Length;i++)
                
{
                    lei_for
=0;
                    aryfilter_lei 
= aryfilter[i].Split(',');
                    
for(j=0;j<aryfilter_lei.Length;j++)
                    
{
                        
if( str.IndexOf(aryfilter_lei[j].ToString())>=0 )
                            lei_for 
+= 1;
                    }

                    
if( lei_for == aryfilter_lei.Length )
                        
return true;
                }

            }

            
return false;
        }



        
#endregion
 

        
字符集转换

        
字符串格式化

        
身份证验证

        
#region 随机数
        
public static string  GetRandNum( int randNumLength )
        
{
            System.Random randNum 
= new System.Random( unchecked( ( int ) DateTime.Now.Ticks ) );
            StringBuilder sb 
= new StringBuilder( randNumLength );
            
for ( int i = 0; i < randNumLength; i++ )
            
{
                sb.Append( randNum.Next( 
09 ) );
            }

            
return sb.ToString();
        }


        
#endregion


        
        
    }


}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值