实战node静态文件服务器的示例代码,正则表达式的使用

 

本篇文章主要介绍了实战node静态文件服务器的示例,分享给大家,具体如下:

下面的代码示例使用静态 Regex.IsMatch
方法验证一个字符串是否为有效电子邮件格式。如果字符串包含一个有效的电子邮件地址,则
IsValidEmail 方法返回 true,否则返回
false,但不采取其他任何操作。您可以使用
IsValidEmail,在应用程序将地址存储在数据库中或显示在 ASP.NET
页中之前,筛选出包含无效字符的电子邮件地址。 

1.只读列表

支持功能:

[C#]
bool IsValidEmail(string strIn)
{
// Return true if strIn is in valid e-mail format.
return Regex.IsMatch(strIn,
@”^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$”);
}

 图片 1

  1. 读取静态文件
  2. 访问目录可以自动寻找下面的index.html文件,
    如果没有index.html则列出文件列表
  3. MIME类型支持
  4. 缓存支持/控制
  5. 支持gzip压缩
  6. Range支持,断点续传
  7. 全局命令执行
  8. 子进程运行

  9. 创建服务读取静态文件

2//判断当前文本框是否正整数
public bool IsNumber(string sValue)
{
return
Regex.IsMatch(sValue, @”^[0-9]*[1-9][0-9]*$”);
}

 

首先引入http模块,创建一个服务器,并监听配置端口:

使用二:替换

  <h3 class="item-title">只读列表</h3>   <ul data-role="listview">    <li>列表项A</li>    <li>列表项B</li>   </ul>
 const http = require('http');

 const server = http.createServer();

 // 监听请求
 server.on('request', request.bind(this));

 server.listen(config.port, () => {
  console.log(`静态文件服务启动成功, 访问localhost:${config.port}`);
 });

2.清理输入字符串
下面的代码示例使用静态 Regex.Replace
方法从字符串中抽出无效字符。您可以使用这里定义的 CleanInput
方法,清除掉在接受用户输入的窗体的文本字段中输入的可能有害的字符。CleanInput
在清除掉除 @、-(连字符)和
.(句点)以外的所有非字母数字字符后返回一个字符串。

2.基本列表

写一个fn专门处理请求, 返回静态文件, url模块获取路径:

[C#]
String CleanInput(string strIn)
{
// Replace invalid characters with empty strings.
return Regex.Replace(strIn, @”[^\w\.@-]”, “”);
}

** 

 const url = require('url');
 const fs = require('fs');
 function request(req, res) {
 const { pathname } = url.parse(req.url); // 访问路径

 const filepath = path.join(config.root, pathname); // 文件路径

 fs.createReadStream(filepath).pipe(res); // 读取文件,并响应
 }

3.更改日期格式
以下代码示例使用 Regex.Replace 方法来用 dd-mm-yy 的日期形式代替 mm/dd/yy
的日期形式。

图片 2

支持寻找index.html:

[C#]
String MDYToDMY(String input)
{
return Regex.Replace(input,
“\\b(?<month>\\d{1,2})/(?<day>\\d{1,2})/(?<year>\\d{2,4})\\b”,
“${day}-${month}-${year}”);
}
Regex 替换模式
本示例说明如何在 Regex.Replace
的替换模式中使用命名的反向引用。其中,替换表达式 ${day} 插入由
(?<day>…) 组捕获的子字符串。

  <h3 class="item-title">基本的列表</h3>   <ul data-role="listview">    <li><a href="#page2">列表项A</a></li>    <li><a href="#page2">列表项B</a></li>   </ul>
 if (pathname === '/') {
  const rootPath = path.join(config.root, 'index.html');
  try{
   const indexStat = fs.statSync(rootPath);
   if (indexStat) {
    filepath = rootPath;
   }
  } catch(e) {

  }
 }

有几种静态函数使您可以在使用正则表达式操作时无需创建显式正则表达式对象,而
Regex.Replace
函数正是其中之一。如果您不想保留编译的正则表达式,这将给您带来方便。

 3.数字排序列表

访问目录时,列出文件目录:

4
//替换
  public void Page1()
  {
   txtResult2.Text = “”;
   try
   {
    Regex mRegex = new Regex(txtRegex2.Text);   
    txtResult2.Text = mRegex.Replace(txtStr2.Text,txtRegexRe.Text);
   }   
   catch(Exception e)
   {
    MessageBox.Show(“输入的正则式错误,请重新输入!”,”警告”,MessageBoxButtons.OK,MessageBoxIcon.Information);
   }
  }

** 

 fs.stat(filepath, (err, stats) => {
 if (err) {
  res.end('not found');
  return;
 }
 if (stats.isDirectory()) {
  let files = fs.readdirSync(filepath);
  files = files.map(file => ({
   name: file,
   url: path.join(pathname, file)
  }));
  let html = this.list()({
   title: pathname,
   files
  });
  res.setHeader('Content-Type', 'text/html');
  res.end(html);
 }
 }

使用三:查找

图片 3

html模板:

//查找
  public void Page2()
  {
   txtResult1.Text = “”;
   try
   {   
    Regex mRegex = new Regex(txtRegex1.Text);
    MatchCollection mMactchCol = mRegex.Matches(txtStr1.Text);
    foreach(Match mMatch in mMactchCol)
    {
     txtResult1.Text += string.Format(“{0}
在第{1}个字符被发现!\r\n”,mMatch,mMatch.Index);
    }
    //分割
    string[] sArray = mRegex.Split(txtStr1.Text);
    txtSplit.Text = “”;
    foreach(string sLine in sArray)
    {
     txtSplit.Text += sLine+”\r\n”;
    }
   }
   catch(Exception e)
   {
    MessageBox.Show(“输入的正则式错误,请重新输入!”,”警告”,MessageBoxButtons.OK,MessageBoxIcon.Information);
   }
  }

 

 function list() {
  let tmpl = fs.readFileSync(path.resolve(__dirname, 'template', 'list.html'), 'utf8');
  return handlebars.compile(tmpl);
 }


 <!DOCTYPE html>
 <html lang="en">
 <head>
 <meta charset="UTF-8">
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 <meta http-equiv="X-UA-Compatible" content="ie=edge">
 <title>{{title}}</title>
 </head>
 <body>
 <h1>hope-server静态文件服务器</h1>
 <ul>
  {{#each files}}
  <li>
   <a href={{url}}>{{name}}</a>
  </li>
  {{/each}}
 </ul>
 </body>
 </html>

使用四:提取 

 <h3 class="item-title">数字排序列表</h3>         <ol data-role="listview">              <li><a href="example3.html">The Godfather</a></li>              <li><a href="example3.html">Inception</a></li>              <li><a href="example3.html">The Good, the Bad and the Ugly </a></li>              <li><a href="example3.html">Pulp Fiction</a></li>              <li><a href="example3.html">Schindler's List</a></li>          </ol>

2.MIME类型支持

 

4.分隔列表

利用mime模块得到文件类型,并设置编码:

//网页搜索检测
        public void Page3()
        {
            string sRegex = “”;
            //1-根据关键词检索值来设定正则式
            try
            {                
                sRegex = GetRegex(txtRegex3.Text);
                //MessageBox.Show(sRegex);
                Regex mRegex  = new Regex(sRegex);
                MatchCollection mMactchCol = mRegex.Matches(txtStr3.Text);//定位

图片 4

res.setHeader('Content-Type', mime.getType(filepath) + ';charset=utf-8');

                txtResult3.Text = “”;
                LocData location;
                foreach(Match mMatch in mMactchCol)
                {
                    //直接定位到第i行
                    string[] sCodeArray = mMatch.ToString().Split(‘
‘);
                    location = new LocData();
                    GetLocIndex(txtRegex3.Text,ref location);
                    if(location.nFindIndex == null)//无法定位
                    {
                        return;
                    }
                    else
                    {
                        string sResult;
                        for(int i=0;i<location.nFindIndex.Length;i++)
                        {
                            string sTemp = sCodeArray[location.nFindIndex[i]];//得到定位行源代码-过滤其余部分
                            //分割原定位行正则式
                            Regex mRegex1  = new Regex(“\[\$\][^\$]*\[\^\$\]|\[\$\]”);
                            string[] sArray = mRegex1.Split(location.nFindeValue[i]);
                            
                            MatchCollection mMactchCol1 = mRegex.Matches(txtStr3.Text);//定位
                        }
                    }
                    break;
                }                
            }
            catch(Exception e)
            {
                MessageBox.Show(“输入的正则式错误,请重新输入!”,”警告”,MessageBoxButtons.OK,MessageBoxIcon.Information);
            }            
        }
        //1-根据关键词检索值来设定正则式
        public string GetRegex(string sValue)
        {
            string sRegex = “”;
            Regex mRegex  = new Regex(“\[\$\][^\$]*\[\^\$\]|\[\$\]|\[~\][^~]*\[\^~\]|\[~\]”);    
            string[] sArray = mRegex.Split(sValue);//分割
            MatchCollection mMactchCol = mRegex.Matches(sValue);//定位
            int i = 0;
            Regex replaceReg  = new Regex(“(?<regex>[\[\]\.\^\$\{\}\(\)\|\*\+\?\\])”);
            Regex replaceReg1 = new Regex(“\[\$\](?<regex>[^\$)]*)\[\^\$\]|\[~\](?<regex>[^~]*)\[\^~\]”);

  <h3 class="item-title">分割列表</h3>   <ul data-role="listview">    <li data-role="list-divider">老师</li>    <li><a href="#page2">老师A</a></li>    <li><a href="#page2">老师B</a></li>    <li data-role="list-divider">学生</li>    <li><a href="#page2">学生A</a></li>    <li><a href="#page2">学生B</a></li>    </ul>

3.缓存支持

            //将前面的字符串过滤特殊字符
            sArray[i] = replaceReg.Replace(sArray[i],”\${regex}”);
            sRegex += sArray[i];
            
            foreach(Match mMatch in mMactchCol)
            {                
                //将本查找项替换
                if(mMatch.ToString() == “[$]” || mMatch.ToString() == “[~]”)
                    sRegex += “(\w|\W)*”;//任意字符串,不带换行符
                else
                {                    
                    string sTemp = replaceReg1.Replace(mMatch.ToString(),”${regex}”);
                    sRegex += sTemp;//任意字符串
                }
                
                //将后面的字符串过滤特殊字符
                i++;
                sArray[i] = replaceReg.Replace(sArray[i],”\${regex}”);
                sRegex += sArray[i];
            }
            return sRegex;
        }
        //2-得到行定位数组
        public void GetLocIndex(string sValue,ref LocData location)
        {
            int[] nFindIndex;
            string[] nFindValue;
            string[] sLineArray = sValue.Split(‘ ‘);
            Regex mRegex  = new Regex(“\[\$\][^\$]*\[\^\$\]|\[\$\]”);
            string sSaveIndex = “”;
            string sSaveValue = “”;
            for(int i =0 ; i< sLineArray.Length ; i++)
            {
                if(mRegex.IsMatch(sLineArray[i]))
                {
                    if(sSaveIndex != “”)
                    {
                        sSaveIndex += ” “+i.ToString();
                        sSaveValue += ” “+sLineArray[i];
                    }
                    else
                    {
                        sSaveIndex += i.ToString();
                        sSaveValue += sLineArray[i];
                    }
                }
            }
            //有返回
            string[] sTemp1;
            string[] sTemp2;
            if(sSaveIndex != “”)
            {
                sTemp1 = sSaveIndex.Split(‘ ‘);
                sTemp2 = sSaveValue.Split(‘ ‘);
                if(sTemp1.Length != 0)
                {
                    nFindIndex = new int[sTemp1.Length];
                    nFindValue = new string[sTemp1.Length];
                    for(int i=0;i<sTemp1.Length;i++)
                    {
                        nFindIndex[i] = Convert.ToInt16(sTemp1[i]);
                        nFindValue[i] = sTemp2[i];
                    }
                    location.nFindIndex = nFindIndex;
                    location.nFindeValue= nFindValue;
                }                
            }
            else
            {
                nFindIndex = null;
                nFindValue = null;
            }
        }

5.拓展评论列表

http协议缓存:

    }

图片 5

Cache-Control: http1.1内容,告诉客户端如何缓存数据,以及规则

 

  <h3 class="item-title">拓展评论列表示例</h3>   <ul data-role="listview" data-split-icon="delete">    <li data-role="list-divider">评论列表3</li>    <li>      <img src="images/0.png" />      <h3><a href="#page2">Reviewer A</a></h3>      <p>jQuery Mobile 很方便的把这类结构调整为你看到的这个样式</p>      <p class="ui-li-aside">2012-02-25 21:37</p>    </li>    <li>      <img src="images/1.png" />      <h3><a href="#page2">Reviewer B</a></h3>      <p>jQuery Mobile 很方便的把这类结构调整为你看到的这个样式</p>      <p class="ui-li-aside">2012-02-25 21:45</p>    </li>    <li>      <img src="images/2.png" />      <h3><a href="#page2">Reviewer C</a></h3>      <p>jQuery Mobile 很方便的把这类结构调整为你看到的这个样式</p>      <p class="ui-li-aside">2012-02-26 11:55</p>    </li>   </ul>
  1. private 客户端可以缓存
  2. public 客户端和代理服务器都可以缓存
  3. max-age=60 缓存内容将在60秒后失效
  4. no-cache 需要使用对比缓存验证数据,强制向源服务器再次验证
  5. no-store 所有内容都不会缓存,强制缓存和对比缓存都不会触发

 

6.count列表

Expires: http1.0内容,cache-control会覆盖,告诉客户端缓存什么时候过期

 

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注