生成HTML静态化无非就是模板标签替换,但有细节上有一个功能确需要高级一点的标签替换,也就是能接收设置的参数的标签替换。
日常的替换比如 {$siteTitle$} 也许在程序中就直接 替换成了 siteTitle 这个函数,然后获取它return的内容即可
但是如果比如取5条最新新闻 {$getNews(5)$} 有对应的函数 getNews(5)
但是如果有修改成10条,你就要加一个替换规则 {$getNews(10)$} getNews(10)
当然在书写规则时这种情况并不多,而且中在最初开发时就确定了的,只是维护时显得不方便,每次修改条数就要修改替换规则。
有必要实现参数的识别,经过研究了一阵,实现了这个功能,代码保存如下
public string getContent(string len) {
string rv = "ooxx"+len+"次<br />";
return rv;
}
protected void Page_Load(object sender, EventArgs e)
{
string tag = "{getContent(3)}{getContent(5)}{getContent(8)}";
//要求上实现不管tag括号内是什么数字,都能获取这个值并调用函数返回对应数量的数据
string pattern = "{getContent\\((\\d)\\)}";
string replacement = getContent("$1");
string result = Regex.Replace(tag, pattern, replacement);
Response.Write(result);}
关于这其中,getContent("$1");
在replace 方法中使用 $1 来引用所保存的第一个子匹配。如果有多个子匹配,则可以用 $2, $3 等继续引用。
转载网上的说明如下
http://msdn.microsoft.com:80/scripting/default.htm
下面的正则表达式可以提供这个功能。对 JScript,为:
/(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/
对 VBScript 为:
"(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)"
第一个附加子表达式是用来捕获该 web 地址的协议部分。该子表达式匹配位于一个冒号和两个正斜杠之前的任何单词。第二个附加子表达式捕获该地址的域名地址。该子表达式匹配不包括 '^'、 '/' 或 ':' 字符的任何字符序列。第三个附加子表达式捕获网站端口号码,如果指定了该端口号。该子表达式匹配后跟一个冒号的零或多个数字。最后,第四个附加子表达式捕获由该 web 地址指定的路径以及\或者页面信息。该子表达式匹配一个和多个除'#' 或空格之外的字符。
将该正则表达式应用于上面所示的 URI 后,子匹配包含下述内容:
RegExp.$1 包含 "http"
RegExp.$2 包含 "msdn.microsoft.com"
RegExp.$3 包含 ":80"
RegExp.$4 包含 "/scripting/default.htm"