2008年5月30日星期五

使用正则表达式

我在平时很少用到正则表达式,今天遇到一个特殊的需求:从数据库读取数据显示在一个表格中,如果要显示的数据是一段HTML并且包含背景颜色的样式设置,则最终页面显示的内容不能填满表格,就像下面的样子:

a 
客户要求整个单元格的背景都要变成红色,不能有白色的空隙部分。

本来打算通过样式表来控制使其充满整个单元格,但是失败了,因为很难控制要显示内容的高度和单元格一样高。

第二个方案是在绑定数据的时候判断数据是否包含“background-color”的样式,如果有就在单元格上添加相同的样式,于是就需要用正则表达式从读取的数据中提取“background-color: red;”

例如:

从数据库中读取的原始数据是: <p style="background-color: red; width: 10px;">TEST</p>

绑定到表格后应该是: <td style="background-color: red;"><p style="background-color: red; width: 10px;">TEST</p></td>

我设计的表达式是:background-color:\s*(?<color>.*?);

然后通过下面的代码把背景色应用到单元格中:

cell.Text = value.ToString();

// Check customized background color
// and then apply same color to cell
Regex rg = new Regex(@"background-color:\s*(?<color>.*?);", RegexOptions.IgnoreCase);
Match result = rg.Match(cell.Text);
if (result.Success && result.Groups["color"].Success)
{
    cell.Attributes.CssStyle.Add(HtmlTextWriterStyle.BackgroundColor, result.Groups["color"].Value);
}

在写这段代码之前我专门找了一些正则表达式的资料恶补一番,其中感觉最好的是deerchao的正则表达式30分钟入门教程

正则表达式实在是太强大了!

2008年4月21日星期一

喜欢jQuery没道理

就是喜欢jQuery,今天完成了一个用jQuery调用WebService的功能,在AJAX调用过程中使用了JSON格式,服务器端的WebService是用ASP.NET AJAX Extensions 1.0封装的,客户端本来也打算用ASP.NET AJAX的,但后来发现它太麻烦了:JS脚本必须放在一个ASPX页面,而且必须添加ScriptManager控件,而且还会自动引入很多其他的JS脚本(ScriptResource.axd?xxxxxxxxx)。我还是喜欢jQuery的AJAX API。
其实用jQuery调用WebService很简单:

  1. WebService必须增加属性:[ScriptService]
  2. 必须使用POST方法
  3. HTTP Header的Content-type必须为:"application/json; charset=utf-8"
一个简单的例子如下:
WebService的定义如下:
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ToolboxItem(false)]
[ScriptService]
public class Service : System.Web.Services.WebService
{
[WebMethod]
public CacheKey[] GetAllCacheKeys()
{
return CacheHelper.GetAllCacheKeys();
}

[WebMethod]
public void RemoveByTags(string[] tags)
{
CacheHelper.Remove(tags);
}
}
Javascript如下:
jQuery.ajax({
url: "WebServices/Cache/Service.asmx/GetAllCacheKeys",
type: "POST",
dataType: "json",
beforeSend: function(req){
req.setRequestHeader("Content-type", "application/json; charset=utf-8");
},
success: function(keys){
alert(keys.length);
$.each(keys, function(i, key){
alert(key.Key);
});
}
});
再来一个包含参数的例子:
jQuery.ajax({
url: "WebServices/Cache/Service.asmx/RemoveByTags",
type: "POST",
dataType: "json",
data: "{tags:['intid=3091','dbsung']}",
beforeSend: function(req){
req.setRequestHeader("Content-Type", "");
req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
}
});
为什么要多写一句
req.setRequestHeader("Content-Type", "");呢?原因是带有数据的Ajax调用在IE下执行时"Content-Type"会变成"application/x-www-form-urlencoded, application/json; charset=utf-8"原因不详,所以我就多写了一句,先清空"Content-Type"。

2008年1月20日星期日

试用Blog离线工具Qumana

本来是Mac平台的软件现在有了Windows版本了,使用一番看看如何。


首先软件的界面还可以,但还是觉得不想Windows下的程序


另外发现安已有Blog的Tags没有读取出来。


本来打算贴几副图片,最后提示我插入的是本地图片不会被显示在Blog中:-( 只能先传到Picasa了。



Tags: , , ,


Powered by Qumana


2008年1月19日星期六

Ubuntu中的Blog离线工具:Gnome-Blog

经过搜索发现了一些能在Ubuntu下使用的Blog离线工具,这篇文章是用Gnome-Blog发布的,Gnome-Blog安装以后的中文名称叫:Blog 条目张贴器,它非常简单而且支持Blogger.com,最让我高兴的是它能发现我在Blogger.com的Blog即使现在Blogger.com已经被封锁了,这一点不像Windows Live Writer,无论如何先试试能不能把Blog发布出去吧。
=======================================
看来Gnome-Blog对目前版本的Blogger.com的支持还是有问题呀:标题没有设置好,变成了内容。

2008年1月17日星期四

在GMail中用is:unread搜索未读邮件

今天在整理GMail的邮件的时候发现有100封未读邮件,但这些邮件并没有显示在GMail的当前页中,应该是很早之前的邮件,于是我就想看看怎么才能搜索到这些邮件,查询了GMail的联机帮助找到了这篇帮助:Using advanced search,用is:操作符就行了,另外还有很多其他操作符,这些操作符的设置很人性化很容易记住。

Google太伟大了!