Regular Expressions 101

Save & Share

Flavor

  • PCRE2 (PHP >=7.3)
  • PCRE (PHP <7.3)
  • ECMAScript (JavaScript)
  • Python
  • Golang
  • Java 8
  • .NET 7.0 (C#)
  • Rust
  • Regex Flavor Guide

Function

  • Match
  • Substitution
  • List
  • Unit Tests

Tools

Sponsors
There are currently no sponsors. Become a sponsor today!
An explanation of your regex will be automatically generated as you type.
Detailed match information will be displayed here automatically.
  • All Tokens
  • Common Tokens
  • General Tokens
  • Anchors
  • Meta Sequences
  • Quantifiers
  • Group Constructs
  • Character Classes
  • Flags/Modifiers
  • Substitution
  • A single character of: a, b or c
    [abc]
  • A character except: a, b or c
    [^abc]
  • A character in the range: a-z
    [a-z]
  • A character not in the range: a-z
    [^a-z]
  • A character in the range: a-z or A-Z
    [a-zA-Z]
  • Any single character
    .
  • Alternate - match either a or b
    a|b
  • Any whitespace character
    \s
  • Any non-whitespace character
    \S
  • Any digit
    \d
  • Any non-digit
    \D
  • Any word character
    \w
  • Any non-word character
    \W
  • Non-capturing group
    (?:...)
  • Capturing group
    (...)
  • Zero or one of a
    a?
  • Zero or more of a
    a*
  • One or more of a
    a+
  • Exactly 3 of a
    a{3}
  • 3 or more of a
    a{3,}
  • Between 3 and 6 of a
    a{3,6}
  • Start of string
    ^
  • End of string
    $
  • A word boundary
    \b
  • Non-word boundary
    \B

Regular Expression
No Match

r"
"

Test String

Code Generator

Generated Code

re = /key[ :']+([^,;'"]+)[ '",;]+/ str = '<!DOCTYPE html> <!--[if lt IE 7]><html class="ie6 oldie" lang="zh"><![endif]--> <!--[if IE 7]><html class="ie7 oldie" lang="zh"><![endif]--> <!--[if IE 8]><html class="ie8 oldie" lang="zh"><![endif]--> <!--[if gt IE 8]><!--> <html lang="zh"> <!--<![endif]--> <head> <meta http-equiv="X-UA-Compatible" content="edge" /> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <meta name="renderer" content="webkit"> <!--[if lt IE 7]> <meta http-equiv="refresh" content="0; url=http://miwifi.com/cgi-bin/luci/web/ieblock" /> <![endif]--> <!--[if gte IE 9]> <style> body { filter: none; } </style> <![endif]--> <title>小米路由器</title> <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no"> <link href="/xiaoqiang/web/css/bc.css?v=0.0.3" rel="stylesheet"> <link href="/xiaoqiang/web/css/login.css?v=0.0.3" rel="stylesheet"> </head> <body> <div id="doc"> <div id="hd"> </div> <div id="bd"> <div class="mod-login"> <div class="title"> <img src="/xiaoqiang/web/img/zh_cn/bg_login_tit.png?v=0.0.3" height="124"> </div> <div class="pic"> <img src="/xiaoqiang/web/img/topograph/router_r3_101.png" > </div> <div class="rtname"> Xiaomi_6FAC (家) </div> <form id="rtloginform" name="rtloginform" method="post" class="form-login"> <div class="form-item"> <span class="v"><input id="password" class="ipt-text" type="password" name="router_password" autocomplete="off" placeholder="请输入路由器管理密码" reqMsg="请输入路由器管理密码"></span> <em class="t"></em> </div> <div class="form-contral"> <a id="btnRtSubmit" class="btn-login"></a> </div> </form> <div class="mobile-ft"> <p> <a target="_blank" href="http://www1.miwifi.com">官方网站</a> </p> </div> </div> </div> <div id="ft"> <p>&copy; 2015 小米路由器<span>|</span><a href="http://www1.miwifi.com" target="_blank">官方网站</a><span>|</span><a href="http://weibo.com/xiaomiluyouqi" target="_blank">官方微博</a><span>|</span><a href="https://land.xiaomi.net/res/e1fdbc3/land/miwifi/wf_2dcode.jpg" target="_blank" id="wechatcode">官方微信</a><span>|</span><a href="http://bbs.xiaomi.cn/f-354" target="_blank">用户社区</a><span>|</span><a target="_blank" href="http://www1.miwifi.com/miwifi_faq.html">常见问题</a><span>|</span>服务热线 400-100-5678<p> </div> </div> <!--[if lt IE 7]> <script> try{ document.execCommand("BackgroundImageCache",false,true);} catch(e){} </script> <![endif]--> <div class="mask-menu" id="maskMenu" style="position:fixed;left:0;top:0; width:100%; height:100%; z-index:2; display:none;"></div> <div id="dropmenu" class="dropmenu" style="z-index:3; display:none;"> <ul> <li><a href="#" id="toRename">修改路由器名称</a></li> <li><a href="/cgi-bin/luci/web/setting/upgrade">系统升级</a></li> <li><a href="#" id="toDownloadClient">下载客户端</a></li> <li><a href="#" id="toReboot">重启</a></li> <li class="last"><a href="/cgi-bin/luci/web/logout">注销</a></li> </ul> </div> <div id="noticebar" class="noticebar" style="z-index:3; display:none;"> <i class="ico-arrow"></i> <div class="content"></div> </div> <script> var i18n = {}; i18n.dialog = { ok: \'确认\', cancel: \'取消\', loading: \'加载中...\', dlgtitle: \'消息框\' }; i18n.valid = { n_integer: \'请输入一个{$0}位正整数。\', n_format: \'数字输入格式为&#34;{$0}&#34;。\', n_upper: \'输入值太大,最大允许{$0}。\', //注意:{$0}表示允许值,{$1}表示实际值 n_lower: \'输入值太小,最小允许{$0}。\', nrange_from: \'您输入的范围不合理。\', nrange_to: \'您输入的范围不合理。\', n_useless_zero: \'数字前面好像有多余的&#34;0&#34;。\', d_format: \'日期输入格式为&#34;YYYY-MM-DD&#34;。\', d_upper: \'日期太晚,最晚允许{$0}。\', d_lower: \'日期太早,最早允许{$0}。\', daterange_from: \'起始日期不能大于截止日期。\', daterange_to: \'截止日期不能小于起始日期。\', daterange_larger_span: "时间跨度不得超过{$0}天。", text_longer: \'最多允许{$0}个字。\', //\'{$1}字太多,最多允许{$0}字\' text_shorter: \'请至少输入{$0}个字。\', //\'{$1}字太少,最少允许{$0}字\' bytetext_longer: \'最多允许{$0}个字节。\', //\'{$1}字节太多,最多允许{$0}字节\' bytetext_shorter: \'请至少输入{$0}个字节。\', //\'{$1}字节太少,最少允许{$0}字节\' richtext_longer: \'最多允许{$0}个字。\', richtext_shorter: \'请至少输入{$0}个字。\', _reconfirm: \'两次输入不一致。\', _time: \'请检查您输入的时间格式。\', _minute: \'请检查您输入的时间格式。\', _email: \'请检查您输入的Email格式。\', _mobilecode: \'请检查您输入的手机号码。\', _phone: \'请检查您输入的电话号码。\', _phonewithext: \'请检查您输入的电话号码。\', _phonezone: \'请检查您输入的电话区号。\', _phonecode: \'请检查您输入的电话号码。\', _phoneext: \'请检查您输入的电话分机号码。\', _zipcode: \'请检查您输入的邮政编码。\', _idnumber: \'请检查您输入的身份证号码,目前只支持15位或者18位。\', _bankcard: \'请检查您输入的银行账号。\', _cnname: \'请检查您输入的姓名。\', _vcode: \'请检查您输入的验证码。\', _imgfile: \'请检查您选择的图片文件路径,只支持jpg、jpeg、png、gif、tif、bmp格式。\', _regexp: \'请检查您的输入。\', _magic: \'请检查您的输入。\', _req_text: \'请填写{$0}。\', _req_select: \'请选择{$0}。\', _req_file: \'请上传{$0}。\', _logicrequired: \'{$0}输入不完整.\', _ssid: \'请输入标准字符,如 Xiaomi.Luyouqi\', _macaddr: \'MAC地址格式有误,如ab:cd:ef:11:22:33\', _weppassword: \'密码输入有误\', _wifipassword: \'不能包含中文\', _ipaddr: \'IP地址由4个 0~255 之间的数字组成,数字之间用点区隔\', _url: \'必须是完整的URL,如 http://miwifi.com\' }; </script> <script src="/js/jquery-1.8.3.js?v=0.0.3"></script> <script src="/js/qwrap.js?v=0.0.3"></script> <script src="/js/common.js?v=0.0.3"></script> <script src="/js/raphael.js?v=0.0.3"></script> <script src="/js/crypto-js/rollups/sha1.js?v=0.0.3"></script> <script src="/js/crypto-js/rollups/aes.js?v=0.0.3"></script> <script src="/js/valid.js?v=0.0.3"></script> <script src="/xiaoqiang/web/js/selectbeautify.js?v=0.0.3"></script> <script src="/xiaoqiang/web/js/jquery.dialog.js?v=0.0.3"></script> <script src="/xiaoqiang/web/js/jquery.cookie.js?v=0.0.3"></script> <script> (function(){ var hardwareModel = \'R3\', R1CM = hardwareModel === \'R1CM\', R1CL = hardwareModel === \'R1CL\', R1D = hardwareModel === \'R1D\', R2D = hardwareModel === \'R2D\', R3 = hardwareModel === \'R3\'; var G_CONFIG = { R1CM : R1CM, R1CL : R1CL, R1D: R1D, R2D: R2D, R3: R3 }; var G_FEATURES = $.parseJSON(\'{"hardware":{".name":"hardware",".type":"features","disk":"0",".index":4,".anonymous":false,"usb":"1"},"apps":{".name":"apps",".type":"features","apptc":"0",".anonymous":false,"qos":"1",".index":3},"wifi":{".name":"wifi",".type":"features","wifi24":"1","wifi50":"1","wifiguest":"1",".anonymous":false,".index":1},"apmode":{".name":"apmode",".type":"features",".index":2,"wifiapmode":"1",".anonymous":false,"lanapmode":"1"},"system":{".name":"system",".type":"features","shutdown":"0","i18n":"0","downloadlogs":"0",".anonymous":false,".index":0}}\'); window[\'G_CONFIG\'] = G_CONFIG; window[\'G_FEATURES\'] = G_FEATURES; }()) </script> <script> // reboot var global_api_reboot = { url : \'/cgi-bin/luci/api/xqsystem/reboot\', param : {"client":"web"} }; function reboot_window( needconfirm ) { console.log( needconfirm ); var reboot = function(){ $.getJSON( global_api_reboot.url, global_api_reboot.param, function( rsp ) { if( rsp.code !== 0 ){ $.alert( rsp.msg ).time( 1.5*1000 ); } else { var ip = rsp.lanIp[0].ip; rebootWait( { lanIp : ip, action : \'重启路由器\', refresh : true } ); } }); }; if ( typeof( needconfirm ) !== "undefined" && needconfirm === false ) { reboot(); return; } $.confirm(\'确定重启路由器,重启将断开和小米路由器的连接。\',function () { var dlg = this; reboot(); dlg.close(); return false; }); } // shutdown function shutdown_window(){ $.confirm(\'是否确定关闭路由器,操作将断开和小米路由器的连接。\', function () { $.getJSON( \'/cgi-bin/luci/api/xqsystem/shutdown\', {}, function( rsp ){ if( rsp.code !== 0 ){ $.alert(rsp.msg).time( 1.5*1000 ); } else { $.loadingDialog({ title: \'关闭路由器\', content: \'关机中,请等待路由器指示灯熄灭后再断开电源\' }); } }); }); } //reset function reset_window( format ){ var reset = (function( format ){ var requestURL = \'/cgi-bin/luci/api/xqsystem/reset\', requestData = { format: format ? 1 : 0 }, wait = function(){ rebootWait( { action : \'恢复出厂设置\', refresh : true, lanIp: \'192.168.31.1\' } ); }, clearCookies = function (){ var keys = document.cookie.match(/[^ =;]+(?=\\=)/g); if ( keys ) { for (var i = keys.length; i--;){ document.cookie = keys[i]+\'=0;path=/;expires=\' + new Date(0).toUTCString(); } } }; return function(){ $.getJSON( requestURL , requestData, function( rsp ) { if ( rsp.code !== 0 ) { $.alert( rsp.msg ).time( 3*1000 ); }else{ // clear cookies clearCookies(); //block wait wait(); } }); } })( format ); $.confirm(\'确定要恢复出厂设置让小米路由器回到初始状态?\', function(){ reset(); }); } </script> <script type="text/tmpl" id="tplrename"> <div class="mod-rename-dlg"> <p class="img"><img src="/xiaoqiang/web/img/topograph/router_r3_101.png"></p> <div class="form-rename"> <form action="#" class="form" id="routerNameEdit"> <div class="form-item"> <label class="k">路由器名称</label> <span class="v"> <input type="text" name="routername" id="routername" class="ipt-text" autocomplete="off" datatype="bytetext" maxlength="24" reqMsg="路由器名称" value="{$name}"> </span> <em class="t"></em> </div> <div class="form-item"> <label class="k">位置</label> <span class="v"> <input type="text" name="locale" id="locale" class="ipt-text" autocomplete="off" datatype="bytetext" maxlength="24" reqMsg="路由器位置" value="{$locale}"> </span> <em class="t"></em> </div> <div class="form-contral"> <button type="submit" class="btn btn-primary btn-l"><span>保存</span></button> </div> </form> </div> </div> </script> <script type="text/tmpl" id="tplshutdown"> <div class="mod-reboot-dlg"> <p class="img"><img src="/xiaoqiang/web/img/ico_shutdown.png"></p> <p class="text">关闭路由器将断开其他设备的数据访问和网络连接,之后便可以安全的断开电源。(再次启动需要手工连接电源)</p> <button id="shutdownAction" type="button" class="btn btn-primary btn-l"><span>关闭路由器</span></button> </div> </script> <script type="text/tmpl" id="tplreboot"> <div class="mod-shutdown-dlg"> <p class="img"><img src="/xiaoqiang/web/img/ico_reboot.png"></p> <p class="text">路由器重启需要等待十几秒或更多时间,重启过程中将会断开网络连接,稍后将自动重新连接网络。</p> <button type="button" id="rebootAction" class="btn btn-primary btn-l"><span>重启路由器</span></button> </div> </script> <script type="text/tmpl" id="tpldownloadclient"> <div class="mod-downloadclient-dlg"> <table> <tr> <td> <i class="ico-down-client ico-down-pc"></i> <a href="http://bigota.miwifi.com/xiaoqiang/client/xqpc_client.exe">PC客户端</a> </td> <td class="c1"></td> <td class="c2"></td> <td> <i class="ico-down-client ico-down-mac"></i> <a href="http://bigota.miwifi.com/xiaoqiang/client/xqmac_client.dmg">MAC客户端</a> </td> </tr> <tr class="last"> <td> <i class="ico-down-client ico-down-andriod"></i> <a href="http://bigota.miwifi.com/xiaoqiang/client/xqapp_dev.apk">Android客户端</a> <img class="onlineimg" src-local="/xiaoqiang/web/img/2dcode.png" src="http://www1.miwifi.com/statics/img/wf_2dcode_an_dl_dev.png"> </td> <td class="c1"></td> <td class="c2"></td> <td> <i class="ico-down-client ico-down-iphone"></i> <a href="https://itunes.apple.com/cn/app/id859962702?mt=8&ls=1">iPhone客户端</a> <img class="onlineimg" src-local="/xiaoqiang/web/img/2dcode.png" src="http://www1.miwifi.com/statics/img/wf_2dcode_ios_dl.png"> </td> </tr> </table> </div> </script> <script> var DEBUG = false; if ( !window.console || DEBUG == false) { window.console = { log: function(){} }; } var Encrypt = { key: \'a2ffa5c9be07488bbb04a3a47d3c5f6a\', iv: \'64175472480004614961023454661220\', nonce: null, init: function(){ var nonce = this.nonceCreat(); this.nonce = nonce; return this.nonce; }, nonceCreat: function(){ var type = 0; var deviceId = \'30:65:ec:3b:e2:9a\'; var time = Math.floor(new Date().getTime() / 1000); var random = Math.floor(Math.random() * 10000); return [type, deviceId, time, random].join(\'_\'); }, oldPwd : function(pwd){ return CryptoJS.SHA1(this.nonce + CryptoJS.SHA1(pwd + this.key).toString()).toString(); }, newPwd: function(pwd, newpwd){ var key = CryptoJS.SHA1(pwd + this.key).toString(); key = CryptoJS.enc.Hex.parse(key).toString(); key = key.substr(0, 32); key = CryptoJS.enc.Hex.parse(key); var password = CryptoJS.SHA1(newpwd + this.key).toString(); var iv = CryptoJS.enc.Hex.parse(this.iv); var aes = CryptoJS.AES.encrypt( password, key, {iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 } ).toString(); return aes; } }; var pingRouter = function( on, off, ip ){ var online = on || function(){}, offline = off || function(){}, host = ip || location.host, imgUrl = \'http://\' + host + \'/xiaoqiang/web/img/logo.png\', time = 5000, timecounter = 0, img = null, wait = function(){ console.log(\'pingRouter:wait\'); offline(); }, done = function(){ console.log(\'pingRouter:done\'); window.clearInterval( timer ); online(); }, loadImg = function( onload, onerror ){ img = new Image(); img.onload = onload; img.onerror = onerror; img.src = imgUrl+\'?\' + (+new Date()); }, timer = window.setInterval(function() { if ( \'onLine\' in navigator ) { if ( navigator.onLine ) { loadImg( function(){ done(); }, function(){ wait(); } ); } else { wait(); } }else{ loadImg(function(){ done(); }, function(){ wait(); }); } }, time ); }; var rebootWait = function ( opt ) { var action = opt.action, ip = opt.lanIp || window.location.host, refresh = opt.refresh || false, tStart = ( +new Date() ), tUse, dlgRebootWait = $.loadingDialog({ title : \'重启中...\', content : action + \'操作生效,等待设备重启...\' }), online = function(){ dlgRebootWait.content( \'操作生效,重启成功!\' ); dlgRebootWait.time( 3*1000 ); if( refresh ){ window.setTimeout( \'window.top.location.href="http://\'+ip+\'";\',3000 ); } }, offline = function(){ tUse = Math.round( ( ( +new Date() ) - tStart ) / 1000 ); if ( tUse > 150 ) { dlgRebootWait.content( \'自动连接路由器失败,请检查无线或者网线是否连接正确。\' ); return; } dlgRebootWait.content( action + \', 等待自动跳转... 用时{$time}秒\'.tmpl({time: tUse}) ); }; window.setTimeout( function(){ pingRouter( online, offline, ip ); }, 1000 * 60 ); }; (function( $ ){ function formInit( container ) { var clsInput = \'form-item form-item-input\', clsEmpty = \'form-item form-item-empty\', clsDisabled = \'form-item-disabled\', clsError = \'form-item-err\', clsPassword = \'form-item-pwd\'; container = container || \'body\'; $(container).find( \'.form-item input\' ).each(function(){ var me = this, $me = $( me ), parent = $( me.parentNode.parentNode ), label = parent.find( \'.k\' ), offsetX = $me.position().left; if ( !( this.type == \'text\' || this.type == \'password\' ) ) { return; } // some input do not need init if ($me.hasClass(\'no-init\')) { return; } if ( me.value !==\'\' ) { parent[0].className = clsInput; } else { parent[0].className = clsEmpty; if ( offsetX > 0 ) { label.css({ \'left\': offsetX + 10 }); } } if ( me.disabled ) { parent.addClass( clsDisabled ); } if ( $me.attr(\'data-type\') === \'password\' ) { parent.addClass( clsPassword ); parent.append( \'<i class="bt-showpwd bt-showpwd-off"></i>\' ); } label.on( \'click\', function(e){ try { me.focus(); } catch ( ex ) {} }); }); var focusHandler = function(){ if ( !( this.type == \'text\' || this.type == \'password\' ) ) { return; } var me = $( this ), parent = $( this.parentNode.parentNode ), label = parent.find( \'.k\' ), t = parent.find( \'.t\' ), classname; if (me.hasClass(\'no-init\')) { return; } if ( parent.hasClass( clsPassword ) ) { classname = clsInput + \' \' + clsPassword; } else { classname = clsInput; } if ( parent.hasClass( clsError ) ) { t.hide(); } label.css({ \'left\': \'auto\' }); label.hide(); parent[0].className = classname; }; var blurHandler = function(){ var me = this, $me = $( me ), parent = $( me.parentNode.parentNode ), classname, label = parent.find( \'.k\' ), offsetX = $me.position().left; if ( !( this.type == \'text\' || this.type == \'password\' ) ) { return; } if ($(this).hasClass(\'no-init\')) { return; } label.show(); if ( me.value == \'\' ) { if ( parent.hasClass( clsPassword ) ) { classname = clsEmpty + \' \' + clsPassword; } else { classname = clsEmpty; } if ( offsetX > 0 ) { label.css({ \'left\': offsetX + 10 }); } else { label.css({ \'left\': 12 }); } parent[0].className = classname; } }; function addInputEvent() { $(container).find( \'.form-item input\' ) .on( \'focus\', focusHandler ) .on( \'blur\', blurHandler ); }; function delInputEvent() { $(container).find( \'.form-item input\' ).off( \'focus\', focusHandler ); $(container).find( \'.form-item input\' ).off( \'blur\', blurHandler ); }; // del password event $( \'body\' ).undelegate( \'.bt-showpwd\', \'click\' ); $( \'body\' ).delegate( \'.bt-showpwd\', \'click\', function(e) { console.log( \'showpwd\' ); var me = this, meclass = \'bt-showpwd\', formItem = $(this).closest(\'.form-item\'), input = formItem.find(\'input\'), inputValue = input.val(), inputWrap = formItem.find(\'.v\'), newinput = \'\', inputHTML = inputWrap.html(); if( input.attr(\'type\') == \'password\' ){ newinput = inputHTML.replace( /type\\s*=\\s*(\'|")?password(\'|")?/ig, \'type="text"\'); inputWrap.html( newinput ).find(\'input\')[0].value = inputValue; me.className = meclass + \' bt-showpwd-on\'; }else{ newinput = inputHTML.replace( /type\\s*=\\s*(\'|")?text(\'|")?/ig, \'type="password"\'); inputWrap.html( newinput ).find(\'input\')[0].value = inputValue; me.className = meclass + \' bt-showpwd-off\'; } setTimeout( function() { delInputEvent(); addInputEvent(); }, 0 ); }); addInputEvent(); } $.formInit = formInit; })(jQuery); /** * byte format */ function byteFormat(number, precision, isarray){ var val, label, ret; precision = precision || 100, isarray = isarray || false; if (number > 1024 * 1024 * 1024) { val = Math.floor( number / 1024 / 1024 / 1024 * precision ) / precision; label = \'GB\'; } else if (number > 1024 * 1024 && number < 1024 * 1024 * 1024){ val = Math.floor( number / 1024 / 1024 * precision ) / precision; label = \'MB\'; }else{ val = Math.floor( number / 1024 * precision ) / precision; label = \'KB\'; } if (isarray) { ret = [val, label]; }else{ ret = val + label; } return ret; } function secondToHour(time){ var pint = function(num){ return parseInt(num, 10); }, hour = pint(time / 3600.0), minute = pint((parseFloat(time / 3600.0) - hour) * 60), second = pint(time) - hour * 3600 - minute * 60, format = hour + \'小时\' + minute + \'分\' + second + \'秒\'; return format; } function secondToDate(second) { var time = parseFloat(second), pint = function(num){ return parseInt(num, 10); }, day; if (time !== null && time !== "") { if (time > 60 && time < 60 * 60) { time = pint(time / 60.0) + \'分\' + pint((parseFloat(time / 60.0) - pint(time / 60.0, 10)) * 60) + \'秒\'; } else if (time >= 60 * 60 && time < 60 * 60 * 24) { time = secondToHour(time); }else if (time >= 24* 60 * 60 ) { day = pint(time / (3600.0 * 24) ); time = time - (day * 3600 * 24); time = day + \'天 \' + secondToHour(time); } else { time = pint(time) + \'秒\'; } } return time; } (function( $ ){ function pint(num){ return parseInt(num, 10); } function secondToHour(time){ var hour = pint(time / 3600.0), minute = pint((parseFloat(time / 3600.0) - hour) * 60), second = pint(time) - hour * 3600 - minute * 60, format = hour + \'小时\' + minute + \'分\' + second + \'秒\'; return format; } function secondToDate(second) { var time = parseFloat(second), day; if (time !== null && time !== "") { if (time > 60 && time < 60 * 60) { time = pint(time / 60.0) + \'分\' + pint((parseFloat(time / 60.0) - pint(time / 60.0, 10)) * 60) + \'秒\'; } else if (time >= 60 * 60 && time < 60 * 60 * 24) { time = secondToHour(time); }else if (time >= 24* 60 * 60 ) { day = pint(time / (3600.0 * 24) ); time = time - (day * 3600 * 24); time = day + \'天\' + secondToHour(time); } else { time = pint(time) + \'秒\'; } } return time; } function secondToDate2(second) { var time = parseFloat(second), num = 0, unit = \'天\'; console.log( second, time ); if (!isNaN(time)) { if (time > 60 && time < 60 * 60) { num = Math.floor(time / 60.0); unit = \'分钟\'; } else if (time >= 60 * 60 && time < 60 * 60 * 24) { num = Math.floor(time / 3600.0); unit = \'小时\' } else if (time >= 24 * 60 * 60 ) { num = Math.floor( time / (3600.0 * 24) ); unit = \'天\'; } else { num = Math.floor(time); unit = \'秒\'; } } return { num: num, unit: unit }; } $.secondToHour = secondToHour; $.secondToDate = secondToDate; $.secondToDate2 = secondToDate2; })( jQuery ); $( document ).ajaxSuccess( function( event, xhr, settings ) { var rsp = xhr.responseText; rsp = $.parseJSON( rsp ); // console.log(event, xhr, settings); var ignore = [ \'api\\/xqsystem\\/login\', \'api\\/xqsystem\\/upgrade_rom\' ]; for (var i = 0; i < ignore.length; i++) { var ignoreTest = new RegExp(ignore[i]); // console.log( ignoreTest ); if ( ignoreTest.test( settings.url ) ) { return; } } if ( rsp.code === 401 || rsp.code === 403) { document.location.href = \'http://\' + location.host; } } ); $.sub( \'wait\', function( evt, data ){ var selector = data.id; if ( !$.waitStatus) { $.waitStatus = {}; } $.waitStatus[selector] = $( selector ).text(); $( selector ).addClass(\'btn-primary-disabled\').prop( \'disabled\' , true ).find(\'span\').text( \'处理中...\' ); } ); $.sub( \'done\', function( evt, data ){ var selector = data.id, text = $.waitStatus[selector]; $( selector ).removeClass(\'btn-primary-disabled\').prop( \'disabled\' , false ).find(\'span\').text( text ); } ); $.sub( \'loading:start\', function(){ var isLoading = $(\'html\').hasClass(\'isloading\'); if ( isLoading ) { return; } var tplMask = \'<div id="panel-loading-mask" class="panel-mask" style="position:fixed;left:0;top:0;style:none;"></div>\', tplLoading = \'\' +\'<div id="panel-loading" class="panel-loading" style="style:none;">\' + \'<img src="/img/loading2.gif">\' +\'</div>\', $mask = $( tplMask ), $loading = $( tplLoading ), zIndex = 10000; $mask.css({ \'z-index\': zIndex, width: $(window).width() + \'px\', height: $(window).height() + \'px\' }); $loading.css({\'z-index\': zIndex + 1}); $mask.appendTo( document.body ).show(); $loading.appendTo( document.body ).show(); $(\'html\').addClass(\'isloading\'); } ); $.sub( \'loading:stop\', function(){ $(\'html\').removeClass(\'isloading\'); $(\'#panel-loading, #panel-loading-mask\').remove(); }); // dialog block loading (function( $ ){ $.loadingDialog = function( config ){ var mix = ObjectH.mix, _config = config || { title: \'\', content: \'\' }, conf = mix( _config, { width: 390, padding:\'25px 30px\', title: config.title, content: \'<p style="padding-bottom:30px;">{$content}</p><div class="loading-bar"></div>\'.tmpl({content: config.content}), cancel: false }, true ), dialog = $.dialog( conf ); var oldcontent = dialog.content; dialog.content = function( cont ){ var _cont = \'<p style="padding-bottom:30px;">{$content}</p><div class="loading-bar"></div>\'.tmpl({content: cont}); return oldcontent.call( dialog, _cont); }; return dialog; } })(jQuery); // dialog alert (function( $ ){ $.alert = function( content, ok ){ ok = ok || function(){}; return $.dialog({ width: 390, padding:\'25px 30px\', title: \'提示信息\', content: content, ok: ok, cancel: false }); } })(jQuery); // dialog confirm (function( $ ){ $.confirm = function( content, ok, cancel ){ var _cancel = cancel || function(){}; return $.dialog({ width: 390, padding:\'25px 30px\', title: \'确认信息\', content: content, ok: ok, cancel: _cancel, lock: true }); } })(jQuery); // wechat code dialog $(function(){ $( \'#wechatcode\' ).click(function( e ){ e.preventDefault(); var $this = $( this ), href = $this.attr( \'href\' ); $.dialog({ title: \'官方微信\', content: \'<img width="200" src="\'+ href +\'">\', width: 250, lock: true }); }); }); // set sys language (function($){ $.i18nSet = function( el ){ var $lan = $( el ), apiGetLan = \'/cgi-bin/luci/api/xqsystem/get_languages\', apiSetlan = \'/cgi-bin/luci/api/xqsystem/set_language\', dtd = $.Deferred(); $.get(apiGetLan, function( rsp ){ var rsp = $.parseJSON( rsp ); var selectContent = []; if ( rsp.code == 0 ) { for (var i = 0; i < rsp.list.length; i++) { var item = rsp.list[i], selected = item.lang == rsp.lang ? \'selected\' : \'\', option = \'<option value="\' + item.lang + \'" \'+ selected +\'>\' + item[\'name\'] + \'</option>\'; // clear old conf en item if ( item.lang != \'en\') { selectContent.push(option); } }; $lan.html( selectContent.join(\'\') ); dtd.resolve(); } }); $lan.on(\'change\', function( e ){ var el = this, val = $(this).val(); $.pub(\'loading:start\'); $.post(apiSetlan, {language: val}, function( rsp ){ var rsp = $.parseJSON( rsp ); if ( rsp.code == 0 ) { location.reload( 1 ); } else { $.alert( rsp.msg ); } $.pub(\'loading:stop\'); }); }); return dtd.promise(); }; }(jQuery)); // global event (function($){ var dlgReboot, dlgShutdown, dlgRouterName; function getNotice(){ $.getJSON(\'/cgi-bin/luci/api/misystem/messages\', function(rsp){ if ( rsp.code == 0 ) { var classname; if ( rsp.count > 0 ) { classname = \'ico-notice-new\'; } else { classname = \'ico-notice\'; } $(\'#sysnotice\')[0].className = classname; var msgMap = { \'1\': \'<p>检测到最新版本为{$version},<a href="/cgi-bin/luci/web/setting/upgrade">点击此处立即升级</a>。</p>\', \'3\': \'<p>5G Wi-Fi启动失败,<a target="_blank" href="http://www.mi.com/service/contact/">请联系小米客服解决</a></p>\', \'4\': \'<p>检测到与上级路由器存在IP冲突,建议切换到<a href="/cgi-bin/luci/web/setting/wan#netmode">有线中继模式</a>或者<a href="#" id="ipconflict" data-ip="{$ip}">避让IP冲突</p>\' }; var msgHTML = []; for (var i = rsp.messages.length - 1; i >= 0; i--) { msgHTML.push(msgMap[rsp.messages[i].type].tmpl(rsp.messages[i].data)); }; $(\'#noticebar .content\').html( msgHTML.join(\'\') ); if ( rsp.count > 0 ) { $(\'#sysnotice\').trigger(\'click\'); } } }); } function reNameHandler(e){ e.preventDefault(); $.getJSON(\'/cgi-bin/luci/api/misystem/router_name\') .done(function( rsp ){ if ( rsp.code == 0 ) { var html = StringH.tmpl($(\'#tplrename\').html() , { locale: StringH.encode4HtmlValue(rsp.locale), name: StringH.encode4HtmlValue(rsp.name) }); dlgRouterName = $.dialog({ width: 390, title: \'修改路由器名称\', content: html, lock: true }); setTimeout(function(){ $.formInit(\'.mod-rename-dlg\'); $.selectBeautify({container: \'.mod-rename-dlg\'}); }, 100); } }); } function downloadClientHandler(e){ e.preventDefault(); $.dialog({ width: 390, title: \'下载客户端\', content: $(\'#tpldownloadclient\').html(), lock: true }); setTimeout(function(){ $(\'.onlineimg\').each(function(){ var img = new Image(); var el = this; var remote = el.src; var local = $(el).attr(\'src-local\'); img.onerror = function(){ el.src = local; } img.src = remote; }); }, 100); } function rebootHandler(e){ e.preventDefault(); dlgReboot = $.dialog({ width: 390, title: \'重启路由器\', content: $(\'#tplreboot\').html(), lock: true }); } function shutdownHandler(e){ e.preventDefault(); dlgShutdown = $.dialog({ width: 390, title: \'路由器关机\', content: $(\'#tplshutdown\').html(), lock: true }); } function noticeHandler(e){ e.preventDefault(); var that = this, $this = $(this), pos = $(\'#userbar\').position(), right, wt = 1160, wwt = $(window).width(), $arrow = $(\'#noticebar .ico-arrow\'); if ( $this.hasClass(\'ico-notice-new\') ) { // right = wt - pos.left - 20; $arrow.css({\'right\': \'10px\'}); $(\'#noticebar\').css({\'right\': (wwt - wt) /2 }); $(\'#noticebar\').toggle(); } $(\'#maskMenu\').height($(window).height()); $(\'#maskMenu\').show(); } function sysmenuHandler(e){ e.preventDefault(); var that = this, $this = $(this); if ( $this.hasClass(\'s-dropdown\') ){ var ww = $(window).width(); // var rt = (ww - 1160) / 2; var lt = $this.offset().left + $this.outerWidth() - $(\'#dropmenu\').width(); $(\'#dropmenu\').css({left: lt}); $(\'#dropmenu\').show(); that.className = \'name s-dropup\'; }else{ $(\'#dropmenu\').hide(); that.className = \'name s-dropdown\'; } $(\'#maskMenu\').height($(window).height()); $(\'#maskMenu\').show(); } function maskHandler(e){ e.preventDefault(); $(\'#noticebar\').hide(); $(\'#dropmenu\').hide(); $(\'#maskMenu\').hide(); $(\'#sysmenu\')[0].className = \'name s-dropdown\'; } $(function(){ // notice $(\'#sysnotice\').click(noticeHandler); // user dropmenu $(\'#sysmenu\').click(sysmenuHandler); // space click $(\'#maskMenu\').click(maskHandler); // rename $( \'body\' ).delegate( \'#toRename\', \'click\', reNameHandler ); // toDownloadClient $( \'body\' ).delegate( \'#toDownloadClient\', \'click\', downloadClientHandler ); // toReboot $( \'body\' ).delegate( \'#toReboot\', \'click\', rebootHandler ); // toShutdown $( \'body\' ).delegate( \'#toShutdown\', \'click\', shutdownHandler); $( \'body\' ).delegate( \'#shutdownAction\', \'click\', function( e ){ e.preventDefault(); dlgShutdown.close(); shutdown_window(); } ); $( \'body\' ).delegate( \'#rebootAction\', \'click\', function( e ){ e.preventDefault(); dlgReboot.close(); reboot_window(); } ); $( \'body\' ).delegate( \'#routerNameEdit\', \'submit\', function( e ){ e.preventDefault(); var validator = Valid.checkAll( this ); var routername = $(\'#routername\').val(); var locale = $(\'#locale\').val(); if ( validator ) { $.getJSON(\'/cgi-bin/luci/api/misystem/set_router_name\',{ name: routername, locale: locale }).done(function(rsp){ if ( rsp.code == 0 ) { location.reload(1); } else { $.alert( rsp.msg ) } }); } } ); $( \'body\' ).delegate(\'#ipconflict\', \'click\', function(e){ e.preventDefault(); var api = \'/cgi-bin/luci/api/misystem/r_ip_conflict\', ip = $(this).attr(\'data-ip\'); $.dialog({ title: \'避让IP冲突\', content: \'执行此操作,局域网IP将会变更为\' + ip + \'<br>\' +\'该过程无线网络会重启,将出现短暂掉线。\', lock: true, ok: function(){ $.post(api, function(rsp){ rsp = $.parseJSON(rsp); if (rsp.code !== 0) { alert(rsp.msg); } }); }, cancel: function(){} }); }); // user logined and has global header get notice if ( typeof(GLOBALHEADER) !== \'undefined\' && GLOBALHEADER === true ) { getNotice(); } }); })(jQuery); </script> <script src="/js/miwifi-monitor.js"></script> <script> // 流量统计 (function(){ var IS_MOBILE = ( navigator.userAgent.match(/Android/i) || navigator.userAgent.match(/webOS/i) || navigator.userAgent.match(/iPhone/i) || navigator.userAgent.match(/iPad/i) || navigator.userAgent.match(/iPod/i) || navigator.userAgent.match(/BlackBerry/i) || navigator.userAgent.match(/Windows Phone/i) ); var PAGEURL = document.URL.split(\'/web/\')[1]; var PAGE_MONITOR_CONF = { deviceId: \'f051907f-3c7c-8667-a254-327d09463e2c\', isMobile: IS_MOBILE ? IS_MOBILE[0] : \'pc\', url: PAGEURL ? \'/web/\' + PAGEURL : \'/web/login\', romVersion: \'2.11.48\', romChannel: \'stable\', hardwareVersion: \'R3\' }; MIWIFI_MONITOR.setProject(\'MIWIFIWEB\'); MIWIFI_MONITOR.log(PAGE_MONITOR_CONF, \'track\'); $(document).ajaxSend(function(event, jqxhr, settings) { var apiUrl = settings.url.split(\'/api/\')[1], api = \'/api/\' + apiUrl.split(\'?\')[0], apiParams = StringH.queryUrl(apiUrl); // console.log(apiUrl, api, apiParams); var API_MONITOR_CONF = ObjectH.mix({element: \'apicall\', api: api}, [PAGE_MONITOR_CONF, apiParams]); // console.log(API_MONITOR_CONF); MIWIFI_MONITOR.log(API_MONITOR_CONF); }); }()); </script> <script> $(function(){ var pwdErrorCount = 0; $( \'#password\' ).focus(); $( \'#password\' ).on( \'keypress\', function( e ) { $(\'#rtloginform .form-item\' ).removeClass( \'form-item-err\' ); $(\'#rtloginform .form-item .t\' ).hide(); }); function buildUrl( s, token ){ if (!window.location.origin){ window.location.origin = window.location.protocol+"//"+window.location.host; } return window.location.origin + \'/cgi-bin/luci/;stok=\' + token+ \'/web/setting/\' + s; } function loginHandle ( e ) { e.preventDefault(); var formObj = document.rtloginform; var pwd = $( \'#password\' ).val(); if ( pwd == \'\') { return; } var nonce = Encrypt.init(); var oldPwd = Encrypt.oldPwd( pwd ); var param = { username: \'admin\', password: oldPwd, logtype: 2, nonce: nonce }; $.pub(\'loading:start\'); var url = \'/cgi-bin/luci/api/xqsystem/login\'; $.post( url, param, function( rsp ) { $.pub(\'loading:stop\'); var rsp = $.parseJSON( rsp ); if ( rsp.code == 0 ) { var redirect, token = rsp.token; if ( /action=wan/.test(location.href) ) { redirect = buildUrl(\'wan\', token); } else if ( /action=lannetset/.test(location.href) ) { redirect = buildUrl(\'lannetset\', token); } else { redirect = rsp.url; } window.location.href = redirect; } else if ( rsp.code == 403 ) { window.location.reload(); } else { pwdErrorCount ++; var errMsg = \'密码错误\'; if (pwdErrorCount >= 4) { errMsg = \'多次密码错误,将禁止继续尝试\'; } Valid.fail( document.getElementById(\'password\'), errMsg, false); $( formObj ) .addClass( \'shake animated\' ) .one( \'webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend\', function(){ $(\'#password\').focus(); $( this ).removeClass(\'shake animated\'); } ); } }); } $( \'#rtloginform\' ).on( \'submit\', loginHandle); $( \'#btnRtSubmit\' ).on( \'click\', loginHandle); $.placeholder(); }); </script> ' # Print the match result str.match(re) do |match| puts match.to_s end

Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for Ruby, please visit: http://ruby-doc.org/core-2.2.0/Regexp.html