首页 文章 精选 留言 我的

精选列表

搜索[正则表达式],共2240篇文章
优秀的个人博客,低调大师

php开发文章发布示例(正则表达式实例开发)

存档: post.php 1 <form method="post" action="viewthread.php" target="_blank"> 2 <h2 align="center">发表文章实例开发</h2> 3 <div style="width:200;float:left"> 4 <h5>选项</h5> 5 <ul style="list-style:none;margin:0px;padding:0px"> 6 <li><input type="checkbox" name="parse[]" value="1">删除HTML标签</li> 7 <li><input type="checkbox" name="parse[]" value="2">转换HTML标签为实体</li> 8 <li><input type="checkbox" name="parse[]" value="3">使用UBB代码</li> 9 <li><input type="checkbox" name="parse[]" value="4">开启URL识别</li> 10 <li title="可用的表情: 11 【:),/wx,微笑】【:@,/fn,发怒】 12 【:kiss,/kill,/sa,示爱】 13 【:p,/tx,偷笑】【:q,/dk,大哭】"> 14 <input type="checkbox" name="parse[]" value="5">使用表情</li> 15 <li><input type="checkbox" name="parse[]" value="6">禁用非法关键字</li> 16 <li><input type="checkbox" name="parse[]" value="7">PHP代码设为高亮</li> 17 <li><input type="checkbox" name="parse[]" value="8">原样显示</li> 18 <li><input type="checkbox" name="parse[]" value="9">同步换行</li> 19 </ul> 20 </div> 21 <div style="width:300;float:left"> 22 <h5>标题<input type="text" name="subject" size=50></h5> 23 <h5>内容<textarea rows="7" cols="50" name="message"></textarea></h5> 24 <input type="submit" name="replysubmit" value="发表帖子"> 25 </div> 26 </form> viewthread.php 1 <?php 2 require "article.class.php"; 3 $article = new Article($_POST["subject"],$_POST["message"],$_POST["parse"]); 4 echo $article->getSubject(); 5 echo "<hr>"; 6 echo $article->getMessage(); 7 ?> article.class.php 1 <?php 2 class Article{ 3 private $subject; 4 private $message; 5 function __construct($subject="",$message="",$parse=array()){ 6 $this->subject = $this->html2Text($subject); 7 if(!empty($parse)){ 8 foreach($parse as $value){ 9 switch($value){ 10 case 1: 11 $message = $this->delHtmlTags($message); 12 break; 13 case 2: 14 $message = $this->html2Text($message); 15 break; 16 case 3: 17 $message = $this->UBBCode2Html($message); 18 break; 19 case 4: 20 $message = $this->parseURL($message); 21 break; 22 case 5: 23 $message = $this->parseSmilies($message); 24 break; 25 case 6: 26 $message = $this->disableKeyWords($message); 27 break; 28 case 7: 29 $message = $this->prasePHPCode($message); 30 break; 31 case 8: 32 $message = $this->prasePer($message); 33 break; 34 case 9: 35 $message = $this->nltobr($message); 36 break; 37 } 38 } 39 } 40 $this->message = $message; 41 } 42 43 private function delHtmlTags($message){ 44 return strip_tags($message); 45 } 46 47 private function html2Text($message){ 48 return htmlspecialchars(stripslashes($message)); 49 } 50 51 private function UBBCode2Html($message){ 52 $pattern = array( 53 '/\[b\]/i','/\[\/b\]/i','/\[i\]/i', 54 '/\[\/i\]/i','/\[u\]/i','/\[\/u\]/i', 55 '/\[font=([^\[\<]+?)\]/i', 56 '/\[color=([#\w]+?)\]/i', 57 '/\[size=(\d+?)\]/i', 58 '/\[size=(\d+(\.\d+)?(px|pt|in|cm|mm|pc|em|ex|%)+?)\]/i', 59 '/\[align=(left|center|right)\]/i', 60 '/\[url=www.([^\["\']+?)\](.+?)\[\/url\]/is', 61 '/\[url=(https?|ftp|gopher|news|telnet){1}:\/\/([^\["\']+?)\](.+?)\[\/url]/is', 62 '/\[email\]\s*([a-z0-9\-_.+]+)@([a-z0-9\-_.]+)\s*\[\/email\]/i', 63 '/\[email=([a-z0-9\-_.+]+)@([a-z0-9\-_]+[.][a-z0-9\-_.]+)\](.+?)\[\/email\]/is', 64 '/\[img\](.+?)\[\/img\]/', 65 '/\[\/color\]/i', 66 '/\[\/size\]/i', 67 '/\[\/font\]/i', 68 '/\[\/align\]/' 69 ); 70 71 $replace = array( 72 '<b>','</b>','<i>', 73 '</i>','<u>','</u>', 74 '<font face="\\1">', 75 '<font color="\\1">', 76 '<font size="\\1">', 77 '<font style=\"font-size:\\1\">', 78 '<p align="\\1">', 79 '<a href="http://www.\\1" target="_blank">\\2</a>', 80 '<a href="\\1://\\2" target="_blank">\\3</a>', 81 '<a href="mailto:\\1@\\2">\\1@\\2</a>', 82 '<a href="mailto:\\1@\\2">\\3</a>', 83 '<img src="\\1">', 84 '</font>','</font>','</font>','</p>' 85 ); 86 return preg_replace($pattern,$replace,$message); 87 } 88 89 private function cuturl($url){ 90 $length = 65; 91 $url = substr(strtolower($url),0,4) == 'www.'?"http://$url":$url; 92 $urllink = "<a href=\"".$url.'"target="_blank">'; 93 if(strlen($url)>$length){ 94 $url = substr($url,0,intval($length*0.5)).'...'.substr($url,-intval($length*0.3)); 95 } 96 $urllink .=$url.'</a>'; 97 return $urllink; 98 } 99 100 private function parseURL($message){ 101 $urlPattern = "/(www.|https?:\/\/|ftp:\/\/|news:\/\/|telnet:\/\/){1}([^\[\"']+?)(com|net|org)(\/[\w-\.\/?\%\&\=]*)?/ei"; 102 return preg_replace($urlPattern,"\$this->cuturl('\\1\\2\\3\\4')",$message); 103 } 104 105 private function parseSmilies($message){ 106 $pattern = array( 107 '/:\)|\/wx|微笑/i', 108 '/:@|\/fn|发怒/i', 109 '/:kiss|\/kill|\/sa|示爱/', 110 '/:p|\/tx|偷笑/i', 111 '/:q|\/dk|大哭/i' 112 ); 113 $replace = array( 114 '<img src="smilies/smile.png" alt="微笑">', 115 '<img src="smilies/huffy.png" alt="发怒">', 116 '<img src="smilies/kiss.png" alt="示爱">', 117 '<img src="smilies/titter.png" alt="偷笑">', 118 '<img src="smilies/cry.png" alt="大哭">' 119 ); 120 return preg_replace($pattern,$replace,$message); 121 } 122 123 private function disableKeyWords($message){ 124 $keywords_disable = array("非法关键字一","非法关键字二","非法关键字三"); 125 return str_replace($keywords_disable,"**",$message); 126 } 127 128 private function prasePHPCode($message){ 129 $pattern = '/(<\?.*?\?>)/ise'; 130 $replace = '"<pre style=\"background:#ddd\">".highlight_string("\\1",true)."</pre>"'; 131 return preg_replace($pattern,$replace,$message); 132 } 133 134 private function prasePer($message){ 135 return '<pre>'.$message.'</pre>'; 136 } 137 138 private function nltobr($message){ 139 return nl2br($message); 140 } 141 142 public function getSubject(){ 143 return '<h1 align=center>'.$this->subject.'</h1>'; 144 } 145 146 public function getMessage(){ 147 return $this->message; 148 } 149 } 150 ?> 结果如下: 您可以考虑给博主来个小小的打赏以资鼓励,您的肯定将是我最大的动力。thx. 微信打赏 支付宝打赏 作 者: Angel_Kitty 出 处:http://www.cnblogs.com/ECJTUACM-873284962/ 关于作者:潜心机器学习以及信息安全的综合研究。如有问题或建议,请多多赐教! 版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。 特此声明:所有评论和私信都会在第一时间回复。也欢迎园子的大大们指正错误,共同进步。或者直接私信我 声援博主:如果您觉得文章对您有帮助,可以点击右下角【推荐】推荐一下该博文。您的鼓励是作者坚持原创和持续写作的最大动力!

优秀的个人博客,低调大师

每日一博 | 2020 年这些正则表达式应该被收藏

作者:铁皮饭盒 原文链接:https://juejin.im/post/5edd89936fb9a047970688a8 GitHub:https://github.com/any86/any-rule 经作者授权转载文章。 推荐一下作者的正则大全,收录在 GitHub 上,目前有 VSCode 的插件可以使用,相当方便: any-rule 正则大全 火车车次 /^[GCDZTSPKXLY1-9]\d{1,4}$/ 复制代码手机机身码(IMEI) /^\d{15,17}$/ 复制代码必须带端口号的网址(或ip) /^((ht|f)tps?:\/\/)?[\w-]+(\.[\w-]+)+:\d{1,5}\/?$/ 复制代码网址(url,支持端口和"?+参数"和"#+参数) /^(((ht|f)tps?):\/\/)?[\w-]+(\.[\w-]+)+([\w.,@?^=%&:/~+#-]*[\w@?^=%&/~+#-])?$/ 复制代码统一社会信用代码 /^[0-9A-HJ-NPQRTUWXY]{2}\d{6}[0-9A-HJ-NPQRTUWXY]{10}$/ 复制代码迅雷链接 /^thunderx?:\/\/[a-zA-Z\d]+=$/ 复制代码ed2k链接(宽松匹配) /^ed2k:\/\/\|file\|.+\|\/$/ 复制代码磁力链接(宽松匹配) /^magnet:\?xt=urn:btih:[0-9a-fA-F]{40,}.*$/ 复制代码子网掩码 /^(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])(?:\.(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])){3}$/ 复制代码linux"隐藏文件"路径 /^\/(?:[^/]+\/)*\.[^/]*/ 复制代码linux文件夹路径 /^\/(?:[^/]+\/)*$/ 复制代码linux文件路径 /^\/(?:[^/]+\/)*[^/]+$/ 复制代码window"文件夹"路径 /^[a-zA-Z]:\\(?:\w+\\?)*$/ 复制代码window下"文件"路径 /^[a-zA-Z]:\\(?:\w+\\)*\w+\.\w+$/ 复制代码股票代码(A股) /^(s[hz]|S[HZ])(000[\d]{3}|002[\d]{3}|300[\d]{3}|600[\d]{3}|60[\d]{4})$/ 复制代码大于等于0, 小于等于150, 支持小数位出现5, 如145.5, 用于判断考卷分数 /^150$|^(?:\d|[1-9]\d|1[0-4]\d)(?:.5)?$/ 复制代码html注释 /^<!--[\s\S]*?-->$/ 复制代码md5格式(32位) /^([a-f\d]{32}|[A-F\d]{32})$/ 复制代码版本号(version)格式必须为X.Y.Z /^\d+(?:\.\d+){2}$/ 复制代码视频(video)链接地址(视频格式可按需增删) /^https?:\/\/(.+\/)+.+(\.(swf|avi|flv|mpg|rm|mov|wav|asf|3gp|mkv|rmvb|mp4))$/i 复制代码图片(image)链接地址(图片格式可按需增删) /^https?:\/\/(.+\/)+.+(\.(gif|png|jpg|jpeg|webp|svg|psd|bmp|tif))$/i 复制代码24小时制时间(HH:mm:ss) /^(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d$/ 复制代码12小时制时间(hh:mm:ss) /^(?:1[0-2]|0?[1-9]):[0-5]\d:[0-5]\d$/ 复制代码base64格式 /^\s*data:(?:[a-z]+\/[a-z0-9-+.]+(?:;[a-z-]+=[a-z0-9-]+)?)?(?:;base64)?,([a-z0-9!$&',()*+;=\-._~:@/?%\s]*?)\s*$/i 复制代码数字/货币金额(支持负数、千分位分隔符) /^-?\d+(,\d{3})*(\.\d{1,2})?$/ 复制代码数字/货币金额 (只支持正数、不支持校验千分位分隔符) /(?:^[1-9]([0-9]+)?(?:\.[0-9]{1,2})?$)|(?:^(?:0){1}$)|(?:^[0-9]\.[0-9](?:[0-9])?$)/ 复制代码银行卡号(10到30位, 覆盖对公/私账户, 参考微信支付) /^[1-9]\d{9,29}$/ 复制代码中文姓名 /^(?:[\u4e00-\u9fa5·]{2,16})$/ 复制代码英文姓名 /(^[a-zA-Z]{1}[a-zA-Z\s]{0,20}[a-zA-Z]{1}$)/ 复制代码车牌号(新能源) /[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领 A-Z]{1}[A-HJ-NP-Z]{1}(([0-9]{5}[DF])|([DF][A-HJ-NP-Z0-9][0-9]{4}))$/ 复制代码车牌号(非新能源) /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领 A-Z]{1}[A-HJ-NP-Z]{1}[A-Z0-9]{4}[A-Z0-9挂学警港澳]{1}$/ 复制代码车牌号(新能源+非新能源) /^(?:[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领 A-Z]{1}[A-HJ-NP-Z]{1}(?:(?:[0-9]{5}[DF])|(?:[DF](?:[A-HJ-NP-Z0-9])[0-9]{4})))|(?:[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领 A-Z]{1}[A-Z]{1}[A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9 挂学警港澳]{1})$/ 复制代码手机号(mobile phone)中国(严谨), 根据工信部2019年最新公布的手机号段 /^(?:(?:\+|00)86)?1(?:(?:3[\d])|(?:4[5-7|9])|(?:5[0-3|5-9])|(?:6[5-7])|(?:7[0-8])|(?:8[\d])|(?:9[1|8|9]))\d{8}$/ 复制代码手机号(mobile phone)中国(宽松), 只要是13,14,15,16,17,18,19开头即可 /^(?:(?:\+|00)86)?1[3-9]\d{9}$/ 复制代码手机号(mobile phone)中国(最宽松), 只要是1开头即可, 如果你的手机号是用来接收短信, 优先建议选择这一条 /^(?:(?:\+|00)86)?1\d{10}$/ 复制代码date(日期) /^\d{4}(-)(1[0-2]|0?\d)\1([0-2]\d|\d|30|31)$/ 复制代码email(邮箱) /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/ 复制代码座机(tel phone)电话(国内),如: 0341-86091234 /^\d{3}-\d{8}$|^\d{4}-\d{7,8}$/ 复制代码身份证号(1代,15位数字) /^[1-9]\d{7}(?:0\d|10|11|12)(?:0[1-9]|[1-2][\d]|30|31)\d{3}$/ 复制代码身份证号(2代,18位数字),最后一位是校验位,可能为数字或字符X /^[1-9]\d{5}(?:18|19|20)\d{2}(?:0[1-9]|10|11|12)(?:0[1-9]|[1-2]\d|30|31)\d{3}[\dXx]$/ 复制代码身份证号, 支持1/2代(15位/18位数字) /(^\d{8}(0\d|10|11|12)([0-2]\d|30|31)\d{3}$)|(^\d{6}(18|19|20)\d{2}(0[1-9]|10|11|12)([0-2]\d|30|31)\d{3}(\d|X|x)$)/ 复制代码护照(包含香港、澳门) /(^[EeKkGgDdSsPpHh]\d{8}$)|(^(([Ee][a-fA-F])|([DdSsPp][Ee])|([Kk][Jj])|([Mm][Aa])|(1[45]))\d{7}$)/ 复制代码帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线组合 /^[a-zA-Z]\w{4,15}$/ 复制代码中文/汉字 /^(?:[\u3400-\u4DB5\u4E00-\u9FEA\uFA0E\uFA0F\uFA11\uFA13\uFA14\uFA1F\uFA21\uFA23\uFA24\uFA27-\uFA29]|[\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0])+$/ 复制代码小数 /^\d+\.\d+$/ 复制代码数字 /^\d{1,}$/ 复制代码html标签(宽松匹配) /<(\w+)[^>]*>(.*?<\/\1>)?/ 复制代码qq号格式正确 /^[1-9][0-9]{4,10}$/ 复制代码数字和字母组成 /^[A-Za-z0-9]+$/ 复制代码英文字母 /^[a-zA-Z]+$/ 复制代码小写英文字母组成 /^[a-z]+$/ 复制代码大写英文字母 /^[A-Z]+$/ 复制代码密码强度校验,最少6位,包括至少1个大写字母,1个小写字母,1个数字,1个特殊字符 /^\S*(?=\S{6,})(?=\S*\d)(?=\S*[A-Z])(?=\S*[a-z])(?=\S*[!@#$%^&*? ])\S*$/ 复制代码用户名校验,4到16位(字母,数字,下划线,减号) /^[a-zA-Z0-9_-]{4,16}$/ 复制代码ip-v4 /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/ 复制代码ip-v6 /^((([0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}:[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){5}:([0-9A-Fa-f]{1,4}:)?[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){4}:([0-9A-Fa-f]{1,4}:){0,2}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){3}:([0-9A-Fa-f]{1,4}:){0,3}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){2}:([0-9A-Fa-f]{1,4}:){0,4}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(([0-9A-Fa-f]{1,4}:){0,5}:((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(::([0-9A-Fa-f]{1,4}:){0,5}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|([0-9A-Fa-f]{1,4}::([0-9A-Fa-f]{1,4}:){0,5}[0-9A-Fa-f]{1,4})|(::([0-9A-Fa-f]{1,4}:){0,6}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){1,7}:))$/i 复制代码16进制颜色 /^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/ 复制代码微信号(wx),6至20位,以字母开头,字母,数字,减号,下划线 /^[a-zA-Z][-_a-zA-Z0-9]{5,19}$/ 复制代码邮政编码(中国) /^(0[1-7]|1[0-356]|2[0-7]|3[0-6]|4[0-7]|5[1-7]|6[1-7]|7[0-5]|8[013-6])\d{4}$/ 复制代码中文和数字 /^((?:[\u3400-\u4DB5\u4E00-\u9FEA\uFA0E\uFA0F\uFA11\uFA13\uFA14\uFA1F\uFA21\uFA23\uFA24\uFA27-\uFA29]|[\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0])|(\d))+$/ 复制代码不能包含字母 /^[^A-Za-z]*$/ 复制代码java包名 /^([a-zA-Z_][a-zA-Z0-9_]*)+([.][a-zA-Z_][a-zA-Z0-9_]*)+$/ 复制代码mac地址 /^((([a-f0-9]{2}:){5})|(([a-f0-9]{2}-){5}))[a-f0-9]{2}$/i 复制代码匹配连续重复的字符 /(.)\1+/ vscode插件 🍭 vscode 商店搜索 any-rule: web版本 🚀 如果你是不用 vscode 也没关系, 访问下方网址即可 👉https://any86.github.io/any-rule/ 交流讨论 欢迎关注公众号「前端试炼」,公众号平时会分享一些实用或者有意思的东西,发现代码之美。专注深度和最佳实践,希望打造一个高质量的公众号。 公众号后台回复「加群」,拉你进交流划水聊天群,有看到好文章/代码都会发在群里。 如果你不想加群,只是想加我也是可以。 如果觉得这篇文章还不错,来个【转发、收藏、在看】三连吧,让更多的人也看到~ ❤️ 顺手点个在看呗 ↓ 本文分享自微信公众号 - 前端试炼(code-photo)。如有侵权,请联系 support@oschina.cn 删除。本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册