Welcome to IcyRiver'blog

Tuesday, September 26, 2006

Javascript中正则表达式的使用

这几天太忙,想看着就要转正,很多事情都压到我的头上。现在逐渐感到有压力和责任感,况且我们的产品是面向数亿中国网民的。有十多天没有更新blog了,今天简单说说正则表达式在javascript里的应用。下面一段话是摘录的:

“正则表达式的“祖先”可以一直上溯至对人类神经系统如何工作的早期研究。Warren McCulloch 和 Walter Pitts这两位神经生理学家研究出一种数学方式来描述这些神经网络。1956 年, 一位叫 Stephen Kleene 的美国数学家在 McCulloch 和 Pitts早期工作的基础上,发表了一篇标题为“神经网事件的表示法”的论文,引入了正则表达式的概念。正则表达式就是用来描述他称为“正则集的代数”的表达式,因此采用“正则表达式”这个术语。随后,发现可以将这一工作应用于使用Ken Thompson 的计算搜索算法的一些早期研究,Ken Thompson是Unix的主要发明人。正则表达式的第一个实用应用程序就是 Unix 中的qed 编辑器。”

使用正则表达式,可以作很多事情,包括:

  • 测试字符串的某个模式。例如,可以对一个输入字符串进行测试,看在该字符串是否存在一个电话号码模式或一个信用卡号码模式。这称为数据有效性验证。
  • 替换文本。可以在文档中使用一个正则表达式来标识特定文字,然后可以全部将其删除,或者替换为别的文字。
  • 根据模式匹配从字符串中提取一个子字符串。可以用来在文本或输入字段中查找特定文字。
下面举两个例子:

判断一个字符串是否符合URL标准格式
var urlRX = new RegExp("((^http)|(^https)):\/\/(\\w+\.)+(\\w)+(/[\\w-./?%&=]*)?");
if(!urlRX.test(yourString))   alert("It is an invalid url string");

判断一个字符串是否符合yyyy-mm-dd
hh:mm:ss时间格式
var timeRX = new RegExp("(\\d){4}-(\\d){2}-(\\d){2}[ ]{1}(\\d){2}:(\\d){2}:(\\d){2}");
if(!timeRX.test(
yourString)) alert("It is an invalid time string");


Monday, September 18, 2006

超酷的三个汽车视频!

这三个令人叹为观止的汽车视频,不论是从作者的制作功力,还是制作耐心上看,都是值得我们尊敬的:










2006梦想中国主题曲--就在今天

就在今天
2006年梦想中国18强 演唱

MP3文件下载地址:到我的box.net下载



歌词

不曾记得梦想开始在哪年
却知道它伴我走到今天
多少次茫然不知向何处
多少次几乎触摸到梦的边缘
春去秋来过了一年又一年
忽然看见了一道彩虹在眼前
是真是幻不敢相信我的眼
多年梦想实现就在一瞬间
就在今天让你我梦实现
按不住我加速的心跳
忍不住我放声呼喊
就在今天就在这一瞬间
登上绚丽舞台告诉世界
证实我的宣言
有过同样的秋天
天空从未如此蔚蓝
多少童年的信念
一直燃烧到今天
就在今天让你我梦实现
唱出心中涌动的旋律
绽放脸上灿烂的笑颜
就在今天就在这一瞬间
要用所有激情感动世界
我的梦不改变
生命从此开始改变

Thursday, September 14, 2006

编程遇到的几个问题

真奇怪,今天编码遇到好几个问题,把重要的几个记下来吧:


1。首先看下面一段代码:

<A onclick=”javascript:window.location.href=’yahoo.com’ ” href=”sohu.com”>Click Me!</A>


浏览器会跳转到哪个页面?
FireFox和IE都会先执行页面JS脚本,然后浏览器再跳转到HREF指向的页面—sohu.com。如果把代码改成这样:


<A onclick=”javascript:window.location.href=’yahoo.com’ ” href=”#”>Click Me!</A>


FireFox和IE还是会先执行页面JS脚本,但由于HREF指向的页面是“#”,所以浏览器会跳转到yahoo.com


2。htmlspecialchars函数可以把引号等特殊字符转换成HTML entities, 如何从HTML entities
还原成相应的特殊字符呢?
PHP5提供了一个函数htmlspecialchars_decode,可以做到.在PHP4环境下,只能通过下面的方法完成转换:
$trans = get_html_translation_table(HTML_SPECIALCHARS);
$trans = array_flip($trans); //只是必须的,否则会产生乱码。
$text = strtr($text, $trans);


3。在构造http
GET请求的字符串时,如果没有把参数的值用urlencode函数进行处理,可能会产生字符编码的问题。例如我构造了这样一个请求,http:
//yahoo.com/somePage.php?p=$string&u=…,变量$string使用UTF8编码的,而页面是GBK编码。
当用户提交这样一个GET请求时,浏览器会把“p=”后面的字符按照GBK编码来处理,后果是可能会把$string的最后一个字符和紧跟着的字符
&结合,而产生混乱的字符。


用urlencode处理$string字符串后,页面上的http GET请求链接就不会有问题。唯一遗憾的是,浏览器在发送请求时,会再一次把参数p的值作一次URI编码处理。服务器端接受到参数p的值后,还得用urldecode函数对字符串进行解码。

Sunday, September 10, 2006

最近很喜欢听刘欢的一首歌---在路上

在路上

刘欢/演唱
王利芬/词
王晓锋/曲

下载地址:

 wma格式:点击这里下载wma文件

mp3格式:点击这里下载mp3文件


歌词
点击这里下载lrc文件 


那一天
我不得已上路
为不安分的心
自尊的生存
为自我的证明
路上的心酸 已融进我的眼睛

心灵的心境 已化作我的坚定
在路上 用我心灵的呼声
在路上 只为伴着我的人
在路上 是我生命的远行
在路上 只为温暖我的人 温暖我的人

那一天
我不得已上路
为不安分的心
为自尊的生存
为自我的证明
路上的心酸 已融进我的眼睛
心灵的困境 已化作我的坚定

在路上 用我心灵的呼声
在路上 只为伴着我的人
在路上 是我生命的远行
在路上 只为温暖我的人 温暖我的人

在路上 用我心灵的呼声
在路上 只为伴着我的人
在路上 是我生命的远行
在路上 只为温暖我的人 温暖我的人

Monday, September 04, 2006

服务器网页缓存的深入分析

Expires、Cache-Control、Last-Modified、ETag是RFC 2616(HTTP/1.1)协议中和网页缓存相关的几个字段。前两个用来控制缓存的失效日期,后两个用来验证网页的有效性。要注意的是, HTTP/1.0有一个功能比较弱的缓存控制机制:Pragma,使用HTTP/1.0的缓存将忽略Expires和Cache-Control头。我们 这里以Apache2.0服务器为例,只讨论HTTP/1.1协议。

Expires

Expires字段声明了一个网页或URL地址不再被浏览器缓存的时间,一旦超过了这个时间,浏览器都应该联系原始服务器。RFC告诉我们:“由于推断的失效时间也许会降低语义透明度,应该被谨慎使用,同时我们鼓励原始服务器尽可能提供确切的失效时间。”

对 于一般的纯静态页面,如html、gif、jpg、css、js,默认安装的Apache服务器,不会在响应头添加这个字段。Firefox浏览器接受到 相应后,如果发现没有Expires字段,浏览器根据文件的类型和“Last-Modified”字段来推断出一个合适的失效时间,并存储在客户端。推测 出的时间一般是接受到响应时间后的三天左右。

Apache的expires_module模块可以在Http响应头部自动加上Expires字段。在Apache的httpd.conf文件中进行如下配置:

#启用expires_module模块
LoadModule expires_module modules/mod_expires.so
# 启用有效期控制
ExpiresActive On
# GIF有效期为1个月
ExpiresByType image/gif A2592000
# HTML文档的有效期是最后修改时刻后的一星期
ExpiresByType text/html M604800
#以下的含义类似
ExpiresByType text/css "now plus 2 month"
ExpiresByType text/js "now plus 2 day"
ExpiresByType image/jpeg "access plus 2 month"
ExpiresByType image/bmp "access plus 2 month"
ExpiresByType image/x-icon "access plus 2 month"
ExpiresByType image/png "access plus 2 month"

对 于动态页面,如果在页面内部没有通过函数强制加上Expires,例如header("Expires: " . gmdate("D, d M Y H:i:s") . " GMT"),Apache服务器会把Wed, 11 Jan 1984 05:00:00 GMT
作为Expires字段内容,返回给浏览器。即认为动态页面总是失效的。而浏览器仍然会保存已经失效的动态页面。

可 以发现Firefox浏览器总是缓存所有页面,不管失效、不失效还是没有声明失效时间。即使缓存中声明了一个网页的实效日期是1970-01-01 08:00:00,浏览器仍然会发送该文件在缓存中的Last-Modified和ETag字段。 如果在服务器端验证通过,返回304状态,浏览器就还会使用此缓存。

Cache-Control

Cache -Control字段中可以声明多些元素,例如no-cache, must-revalidate, max-age=0等。这些元素用来指明页面被缓存最大时限,如何被缓存的,如何被转换到另一个不同的媒介,以及如何被存放在持久媒介中的。但是任何一个 Cache-Control指令都不能保证隐私性或者数据的安全性。“private”和“no-store”指令可以为隐私性和安全性方面提供一些帮 助,但是他们并不能用于替代身份验证和加密。

Apache的mod_cern_meta模块允许文件级Http响应头部的控制,同时它也可以配置Cache-Control头(或任何其他头)。响应头文件是放在原始目录的子目录中,根据原始文件名所命名的一个文件。具体用法请参阅Apache的官方网站。

其 中Cache-Control : max-age表示失效日期。如果没有启动mod_cern_meta模块,Apache服务器会把Expires字段中的日期换算成以秒为单位的一个 delta值,赋值给max-age。如果启动mod_cern_meta模块,并且配置了max-age值,Apache会将这个覆盖Expires字 段。同时,max-age隐含了Canche-Control: public。这样浏览器接受到的Cache-Control : max-age和Expires值就是一致的。

如果失效日期Cache-Control : max-ag=0或者是负值,浏览器会在对应的缓存中把Expires设置为1970-01-01 08:00:00。

Last-Modified

Last -Modified和ETag是条件请求(Conditional Request)相关的两个字段。如果一个缓存收到了针对一个页面的请求,它发送一个验证请求询问服务器页面是否已经更改,在HTTP头里面带上 "ETag"和"If Modify Since"头。服务器根据这些信息判断是否有更新信息,如果没有,就返回HTTP 304(Not Modify);如果有更新,返回HTTP 200和更新的页面内容,并且携带新的"ETag"和"Last-Modified"。

使用这个机制,能够避免重复发送文件给浏览器,不过仍然会产生一个HTTP请求。

一般纯静态页面本身都会有Last-Modified信息,Apache服务器会读取页面文件中的Last-Modified信息,并添加到http响应头部。

对 于动态页面,如果在页面内部没有通过函数强制加上Last-Modified,例如header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"),Apache服务器会把当前时间作为Last-Modified,返回给浏览器。

无论是纯静态页面还是动态页面,Firefox浏览器巧妙地按照接受到服务器响应的时间设置缓存页面的Last-Modified,而不是按照http响应头部中的Last-Modified字段。

ETag

既然有了Last-Modified,为什么还要用ETag字段呢?因为如果在一秒钟之内对一个文件进行两次更改,Last-Modified就会不正确。因此,HTTP/1.1利用Entity Tag头提供了更加严格的验证。

Apache服务器默认情况下,会对所有的静态、动态文件的响应头添加ETag字段。

在Apache 的httpd.conf文件中可以通过FileETag指令配置该选项。FileETag指令配置了当文档是基于一个文件时用以创建Etag (entity tag)响应头的文件的属性。在Apache 1.3.22及以前,ETag的值是对文件的索引节(INode),大小(Size)和最后修改时间(MTime)进行Hash后得到的。 如果一个目录的配置包含了‘FileETag INode MTime Size’而其一个子目录包含了‘FileETag -INode’那么这个子目 录的设置(并会被其下任何没有进行覆盖的子目录继承)将等价于‘FileETag MTime Size’。

在多台负载平衡的服务器环境下,同一个文件会有不同的etag或者文件修改日期,浏览器每次都会重新下载。设置‘FileETag None’可以使响应头不再包含ETag字段。

Sunday, September 03, 2006

今天学到的几个firefox缓存配置技巧

1.更改临时文件存放位置
Firefox默认的缓存保存位置是
%AppData%\Mozilla\Firefox\Profiles\xxxxxxxx.default

在windows 2000/XP 系统下,变量 %AppData%是一个对Application Data路径的简记形式. 使用这个变量的时候,仅仅需要在资源管理器的地址栏中输入 %AppData%然后按Enter就可以了. 您会被代到真正的文件夹下,一般情况下可能是: C:\Documents and Settings\[User Name]\Application Data

在Firefox 的地址栏中输入“about:config“并回车,会看到firefox详细配置页面。 创建一个新的选项,名为browser.cache.disk.parent_directory,类型为字符串,输入新的临时文件路径,例如 D:\FirefoxCache。

2. 改变磁盘缓存容量
在firefox详细配置页面,更改browser.cache.disk.capacity选项的数值,我设置成100000,单位是K,即100M。记得要确保browser.cache.disk.enable选项的值是true。

也可以选择浏览器“工具”菜单下的“选项”命令,在弹出窗口中选择“隐私”,然后在右侧视图中单击展开“高速缓存”,设置容量大小.不过浏览器“工具”菜单中能够配置的参数有限,远远不如“about:config“方式。

3.查看浏览器缓存信息

在Firefox的地址栏中输入"about:cache"并回车,可以看到浏览器目前缓存信息,包括内存缓存和磁盘缓存.点击磁盘缓存的"List Cache Entries",可以查看浏览器当前所有缓存情况,下面是一条缓存信息:

Key: http://images.sohu.com/cs/mms/ad/mms.js
Data size: 6755 bytes
Fetch count: 2
Last modified: 2006-09-01 09:42:59
Expires: 2006-10-29 09:21:52

再点击http://images.sohu.com/cs/mms/ad/mms.js链接,会看到更详细的信息:
key: http://images.sohu.com/cs/mms/ad/mms.js
fetch count: 3
last fetched: 2006-09-03 19:13:22
last modified: 2006-09-01 09:42:59
expires: 2006-10-29 09:21:52
Data size: 6755
file on disk: none
Security: This document does not have any security info associated with it.
Client: HTTP
request-method: GET
request-Accept-Encoding: gzip,deflate
response-head: HTTP/1.1 200 OK
Date: Wed, 30 Aug 2006 01:21:52 GMT
Server: Apache/1.3.33 (Unix) mod_layout/3.2.1
Vary: Accept-Encoding
Cache-Control: max-age=5184000
Expires: Sun, 29 Oct 2006 01:21:52 GMT
Last-Modified: Thu, 26 May 2005 02:53:52 GMT
Etag: "2033b8-1a63-42953a40"
Accept-Ranges: bytes
Content-Length: 6755
Content-Type: application/x-javascript
Via: 1.1 CHN-XA-2-453
Age: 174062