存档

2009年8月 的存档

preg_match的使用方法

2009年8月25日
preg_match的使用方法已关闭评论

preg_match

(PHP 4, PHP 5)

preg_matchPerform a regular expression match

Description

int preg_match ( string $pattern , string $subject [, array &$matches [, int $flags [, int $offset ]]] )

Searches subject for a match to the regular expression given in pattern .

Parameters

pattern

The pattern to search for, as a string.

subject

The input string.

matches

If matches is provided, then it is filled with the results of search. $matches[0] will contain the text that matched the full pattern, $matches[1] will have the text that matched the first captured parenthesized subpattern, and so on.

flags

flags can be the following flag:

PREG_OFFSET_CAPTURE
If this flag is passed, for every occurring match the appendant string offset will also be returned. Note that this changes the return value in an array where every element is an array consisting of the matched string at index 0 and its string offset into subject at index 1.

offset

Normally, the search starts from the beginning of the subject string. The optional parameter offset can be used to specify the alternate place from which to start the search (in bytes).

Note: Using offset is not equivalent to passing substr($subject, $offset) to preg_match() in place of the subject string, because pattern can contain assertions such as ^, $ or (?<=x). Compare:

<?php
$subject
= "abcdef";
$pattern = '/^def/';
preg_match($pattern, $subject, $matches, PREG_OFFSET_CAPTURE, 3);
print_r($matches);
?>

The above example will output:

Array
(
)

while this example

<?php
$subject
= "abcdef";
$pattern = '/^def/';
preg_match($pattern, substr($subject,3), $matches, PREG_OFFSET_CAPTURE);
print_r($matches);
?>

will produce

Array
(
    [0] => Array
        (
            [0] => def
            [1] => 0
        )

)

 

Return Values

preg_match() returns the number of times pattern matches. That will be either 0 times (no match) or 1 time because preg_match() will stop searching after the first match. preg_match_all() on the contrary will continue until it reaches the end of subject . preg_match() returns FALSE if an error occurred.

Changelog

Version Description
4.3.3 The offset parameter was added
4.3.0 The PREG_OFFSET_CAPTURE flag was added
4.3.0 The flags parameter was added

Examples

Example #1 Find the string of text "php"

<?php
// The "i" after the pattern delimiter indicates a case-insensitive search
if (preg_match("/php/i", "PHP is the web scripting language of choice.")) {
echo
"A match was found.";
} else {
echo
"A match was not found.";
}
?>

Example #2 Find the word "web"

<?php
/* The \b in the pattern indicates a word boundary, so only the distinct
* word "web" is matched, and not a word partial like "webbing" or "cobweb" */
if (preg_match("/\bweb\b/i", "PHP is the web scripting language of choice.")) {
echo
"A match was found.";
} else {
echo
"A match was not found.";
}

if (preg_match("/\bweb\b/i", "PHP is the website scripting language of choice.")) {
echo
"A match was found.";
} else {
echo
"A match was not found.";
}
?>

Example #3 Getting the domain name out of a URL

<?php
// get host name from URL
preg_match('@^(?:http://)?([^/]+)@i',
"http://www.php.net/index.html", $matches);
$host = $matches[1];

// get last two segments of host name
preg_match('/[^.]+\.[^.]+$/', $host, $matches);
echo
"domain name is: {$matches[0]}\n";
?>

The above example will output:

domain name is: php.net

Example #4 Using named subpattern

<?php

$str = 'foobar: 2008';

preg_match('/(?<name>\w+): (?<digit>\d+)/', $str, $matches);

print_r($matches);

?>

The above example will output:

Array
(
    [0] => foobar: 2008
    [name] => foobar
    [1] => foobar
    [digit] => 2008
    [2] => 2008
)

Notes

Tip

Do not use preg_match() if you only want to check if one string is contained in another string. Use strpos() or strstr() instead as they will be faster.

See Also

 

IT技术, php ,

w3wp.exe占用CPU高达100% 要怎么解决

2009年8月24日
w3wp.exe占用CPU高达100% 要怎么解决已关闭评论

服务器正常运行CUP一般应该都在60%以下,有时候CUP出现上下波动很大,或者是服务器突然很卡,或很慢.查看任务管理器,可以发现很多的 w3wp.exe消耗CPU,结束后立即有新的w3wp.exe出现占CPU,管理员在这种情况.只好重新启动IIS服务,奇怪的是,重新启动IIS服务后一切正常,但可能过了一段时间后,问题又再次出现了。

w3wp.exe占用CPU高直接原因:
有一个或多个ACCESS数据库在多次读写过程中损坏,微软的MDAC系统在写入这个损坏的ACCESS文件时,ASP线程处于BLOCK状态,结果其他线程只能等待,IIS被死锁了,全部的CPU时间都消耗在w3wp.exe中。

w3wp.exe占用CPU高解决办法:1
在iis管理器里面设置多个应用程序池,并把虚拟主机站点分别加入应用程序池。在多应用程序池的情况下,每个应用程序池会对应生成一个w3wp.exe文件。通过任务管理器可以查看到所有 w3wp.exe占用cpu利用率情况。通过iis管理器打开应用程序池,可以逐个停掉应用程序池。一边停应用程序池,一边在任务管理器里面观察哪个w3wp.exe的cpu利用率一下子从降下来,cpu利用率恢复正常。这样可以判断是那个应用程序池出了问题。然后可以再建立多个应用程序池,每一个应用程序池对应一个站点。这样逐个停应用程序池,就可以确定到底是哪个网站出问题。最有问题的往往是计数器类的ACCESS文件,例如:"**COUNT.MDB" ,"*COUNT.ASP",找到这个文件后,可以删除它,或下载下来,用ACCESS2000修复它,问题就解决。

w3wp.exe占用CPU高解决办法:2
w3wp.exe占用cpu过高查询方法,很多web提供商最头疼的问题,在任务管理器经常出现w3wp.exe占cup过高,导致整台服务器受影响.解决办法如下:
1.先把任务管理器打开,发现那个w3wp.exe占cup关高就结束进程
2.在我的电脑-管理-事件查看器-系统-会找到关w3wp.exe的错误报告,把程序池名字记录下,再把具体时间记录下来.(如12.59.56).
3.在到系统上面的安全性.找到对应时间(如12.59.56)登陆过的用户.
4.打开iis找到2中查询到的程序池,和3查询到登陆过的用户,取交集,即可精确查到是那个web占点站cup.

 

在WINDOWS2003+IIS6下,经常出现w3wp的内存占用不能及时释放,从而导致服务器响应速度很慢。
今天研究了一下,可以做以下配置:
1、在IIS中对每个网站进行单独的应用程序池配置。即互相之间不影响。
2、设置应用程序池的回收时间,默认为1720小时,可以根据情况修改。同时,设置同时运行的w3wp进程数目为1。再设置当内存或者cpu占用超过多少,就自动回收内存

一般来说,这样就可以解决了。但仍然会出现个别网站因为程序问题,不能正确释放。
那么,怎么样才能找到是哪一个网站的?

1、在任务管理器中增加显示pid字段。就可以看到占用内存或者cpu最高的进程pid
2、在命令提示符下运行iisapp -a。注意,第一次运行,会提示没有js支持,点击确定。然后再次运行就可以了。这样就可以看到pid对应的应用程序池
3、到iis中察看该应用程序池对应的网站,就ok了。

问:我的具体情况是这样的:
服务器配置 至强2.8G 内存512M SCSI硬盘 2块 (软镜像)
系统 windows 2003
现在挂了一个asp.net开发的网站 访问量不大 但是出现一个 问题就是
每当服务器运行2-3天后 访问网站就特别慢 重启动服务器后就 正常了
查看进程使用内存的情况 发现w3wp.exe 和sqlservr.exe 进程 占用内存
相当大 达到了170多M( 每个) 物理可用内存几乎用光
(服务器重启动时 占用的内存很小才40多M 每个)
以前网站挂在一个虚拟机上 数据库是分开挂的 从没出现这种情况
后来 原版移植到新服务器上就 出现这样的问题~~
还个一问题就是 我在SQL企业管理器中查看SQL进程 发现有很多是 。net 引起的进程是sleeping 但是却占用了内存~ 无法释放

搞了很久了 一直都没解决
求救~~请高手 指教~~ 万分感谢~~~~~

答:IIS服务管理器—-》应用程序池—-》添加你的应用,并设置最大内存,当程序达到最大内存后其会自动重启。

我的问题跟你一样,不过我的内存是2G的,访问量比较高,一般是差不多运行24小时后就得重启,内存没耗完,W3WP进程占到一百八九十兆,SQL占了二百多兆时,就得重启,不然整个站点就当在那边….55555555,搞了快半个月了还是不行,痛苦啊

w3wp.exe就是你的ASP.NET应用宿主,如果你使用了大量的Session、Cache等资源,并且Session超市时间很长,那么内存占用量就比较大。应用池是为增加性能而设的一个特性,但是也消耗很大的内存。另外关掉Windows Server 2003里的大多数Service(那个不用都可以关掉),也可以节省一部分内存

 

1.怀疑在程序中应用的CACHE,
2.CACHE中有大量的数据
3.频繁刷新CACHE
4.没有设计好CACHE的方式

你的问题我以前也遇见过,我以前是用的Session,后我全部改成cook之后就好多了,应该是你的Session或是你的CACHE有问题(CACHE不太懂,但多多少应该是有的)

跟踪下SQL的调用记录,在每次往CACHE或SESSION写入大量数据时记录一下时间,看是否太过频繁

1.在win2003里asp.net的进程就是w3wp.exe

2.512M内存个人用是够用了,但是放在服务器上就有点不够用了,尤其是win2003 + asp.net +sql server 。尤其是sql server 他是很吃内存的,如果不控制的话,他会占光所有的物理内存(只剩下几十M 倒 100M 吧)。win2003 本身就要占用150M左右。也就剩不下什么了。

3.优化asp.net程序,就向楼上的说的那样,少用或不用session cache application之类的东西,再有就是是不是有翻页的地方,翻页处理不好也是会占很多内存的。

4.限制sql的内存。企业管理器–SQL的属性(一般是local)–"内存"标签
在这里看内存的设置,把最大值改成100M吧。

第四条是最快的方法,可以试一试。

我的一个自开发OA系统也存在这样的问题。
总结上面,大概原因是因为 session 和 cache 的不合理使用造成的。
我的应用程序中,确实用了很多的Session 和 Cache,
在 MSDN 中找到 了 "动态内存分配"这一篇,今天就试看看,是否有效。
希望有经验的朋友多给些信息,大家也好总结下出现类似错误的原因,谢谢!!

不知道你是什么网站。按理说是不会占用这么大的。如上你用了cache存放了超额的内容。当然。象session这种是不太可能占用这么大的了,或用了application 类似的一些

有超长时间或永久保持性的对象来保存大量数据。如利用单例保存数据这些都有可能造成使用大量的内存。

 

建义2003系统安装至少1G内存。

w3wp.exe是2003下的一个iis进程,至于楼主说的sql占用内存,那有可能是因为你的sql没有设置占用内存上限

在IIS6下,经常出现w3wp.exe的内存及CPU占用不能及时释放,从而导致服务器响应速度很慢。

解决内存占用过多,可以做以下配置:
1、在IIS中对每个网站进行单独的应用程序池配置。即互相之间不影响。
2、设置应用程序池的回收时间,默认为1720小时,可以根据情况修改。再设置当内存占用超过多少(如500M),就自动回收内存。

解决CPU占用过多:
1、在IIS中对每个网站进行单独的应用程序池配置。即互相之间不影响。
2、设置应用程序池的CPU监视,不超过25%(服务器为4CPU),每分钟刷新,超过限制时关闭。

根据w3wp取得是那个一个应用程序池:
1、在任务管理器中增加显示pid字段。就可以看到占用内存或者cpu最高的进程pid
2、在命令提示符下运行iisapp -a。注意,第一次运行,会提示没有js支持,点击确定。然后再次运行就可以了。这样就可以看到pid对应的应用程序池。(iisapp实际上是存放在 C:\windows\system32目录下的一个VBS脚本,全名为iisapp.vbs,如果你和我一样,也禁止了Vbs默认关联程序,那么就需要手动到该目录,先择打开方式,然后选"Microsoft (r) Windows Based Script Host"来执行,就可以得到PID与应用程序池的对应关系。)
3、到iis中察看该应用程序池对应的网站,就ok了,做出上面的内存或CPU方面的限制,或检查程序有无死循环之类的问题。

 

IT技术, 互联网 , ,

揭开正则表达式的神秘面纱

2009年8月24日
揭开正则表达式的神秘面纱已关闭评论

[转载文章,出处:http://www.regexlab.com/zh/regref.htm]

引言

    正则表达式(regular expression)就是用一个“字符串”来描述一个特征,然后去验证另一个“字符串”是否符合这个特征。比如 表达式“ab+” 描述的特征是“一个 ‘a’ 和 任意个 ‘b’ ”,那么 ‘ab’, ‘abb’, ‘abbbbbbbbbb’ 都符合这个特征。

    正则表达式可以用来:(1)验证字符串是否符合指定特征,比如验证是否是合法的邮件地址。(2)用来查找字符串,从一个长的文本中查找符合指定特征的字符串,比查找固定字符串更加灵活方便。(3)用来替换,比普通的替换更强大。

   正则表达式学习起来其实是很简单的,不多的几个较为抽象的概念也很容易理解。之所以很多人感觉正则表达式比较复杂,一方面是因为大多数的文档没有做到由浅 入深地讲解,概念上没有注意先后顺序,给读者的理解带来困难;另一方面,各种引擎自带的文档一般都要介绍它特有的功能,然而这部分特有的功能并不是我们首 先要理解的。

    文章中的每一个举例,都可以点击进入到测试页面进行测试。闲话少说,开始。


1. 正则表达式规则

1.1 普通字符

    字母、数字、汉字、下划线、以及后边章节中没有特殊定义的标点符号,都是"普通字符"。表达式中的普通字符,在匹配一个字符串的时候,匹配与之相同的一个字符。

    举例1:表达式 "c",在匹配字符串 "abcde" 时,匹配结果是:成功;匹配到的内容是:"c";匹配到的位置是:开始于2,结束于3。(注:下标从0开始还是从1开始,因当前编程语言的不同而可能不同)

    举例2:表达式 "bcd",在匹配字符串 "abcde" 时,匹配结果是:成功;匹配到的内容是:"bcd";匹配到的位置是:开始于1,结束于4。


1.2 简单的转义字符

    一些不便书写的字符,采用在前面加 "\" 的方法。这些字符其实我们都已经熟知了。

表达式

可匹配

\r, \n

代表回车和换行符

\t

制表符

\\

代表 "\" 本身

    还有其他一些在后边章节中有特殊用处的标点符号,在前面加 "\" 后,就代表该符号本身。比如:^, $ 都有特殊意义,如果要想匹配字符串中 "^" 和 "$" 字符,则表达式就需要写成 "\^" 和 "\$"。

表达式

可匹配

\^

匹配 ^ 符号本身

\$

匹配 $ 符号本身

\.

匹配小数点(.)本身

    这些转义字符的匹配方法与 "普通字符" 是类似的。也是匹配与之相同的一个字符。

    举例1:表达式 "\$d",在匹配字符串 "abc$de" 时,匹配结果是:成功;匹配到的内容是:"$d";匹配到的位置是:开始于3,结束于5。


1.3 能够与 ‘多种字符’ 匹配的表达式

    正则表达式中的一些表示方法,可以匹配 ‘多种字符’ 其中的任意一个字符。比如,表达式 "\d" 可以匹配任意一个数字。虽然可以匹配其中任意字符,但是只能是一个,不是多个。这就好比玩扑克牌时候,大小王可以代替任意一张牌,但是只能代替一张牌。

表达式

可匹配

\d

任意一个数字,0~9 中的任意一个

\w

任意一个字母或数字或下划线,也就是 A~Z,a~z,0~9,_ 中任意一个

\s

包括空格、制表符、换页符等空白字符的其中任意一个

.

小数点可以匹配除了换行符(\n)以外的任意一个字符

    举例1:表达式 "\d\d",在匹配 "abc123" 时,匹配的结果是:成功;匹配到的内容是:"12";匹配到的位置是:开始于3,结束于5。

    举例2:表达式 "a.\d",在匹配 "aaa100" 时,匹配的结果是:成功;匹配到的内容是:"aa1";匹配到的位置是:开始于1,结束于4。


1.4 自定义能够匹配 ‘多种字符’ 的表达式

    使用方括号 [ ] 包含一系列字符,能够匹配其中任意一个字符。用 [^ ] 包含一系列字符,则能够匹配其中字符之外的任意一个字符。同样的道理,虽然可以匹配其中任意一个,但是只能是一个,不是多个。

表达式

可匹配

[ab5@]

匹配 "a" 或 "b" 或 "5" 或 "@"

[^abc]

匹配 "a","b","c" 之外的任意一个字符

[f-k]

匹配 "f"~"k" 之间的任意一个字母

[^A-F0-3]

匹配 "A"~"F","0"~"3" 之外的任意一个字符

    举例1:表达式 "[bcd][bcd]" 匹配 "abc123" 时,匹配的结果是:成功;匹配到的内容是:"bc";匹配到的位置是:开始于1,结束于3。

    举例2:表达式 "[^abc]" 匹配 "abc123" 时,匹配的结果是:成功;匹配到的内容是:"1";匹配到的位置是:开始于3,结束于4。


1.5 修饰匹配次数的特殊符号

    前面章节中讲到的表达式,无论是只能匹配一种字符的表达式,还是可以匹配多种字符其中任意一个的表达式,都只能匹配一次。如果使用表达式再加上修饰匹配次数的特殊符号,那么不用重复书写表达式就可以重复匹配。

    使用方法是:"次数修饰"放在"被修饰的表达式"后边。比如:"[bcd][bcd]" 可以写成 "[bcd]{2}"。

表达式

作用

{n}

表达式重复n次,比如:"\w{2}" 相当于 "\w\w""a{5}" 相当于 "aaaaa"

{m,n}

表达式至少重复m次,最多重复n次,比如:"ba{1,3}"可以匹配 "ba"或"baa"或"baaa"

{m,}

表达式至少重复m次,比如:"\w\d{2,}"可以匹配 "a12","_456","M12344"…

?

匹配表达式0次或者1次,相当于 {0,1},比如:"a[cd]?"可以匹配 "a","ac","ad"

+

表达式至少出现1次,相当于 {1,},比如:"a+b"可以匹配 "ab","aab","aaab"…

*

表达式不出现或出现任意次,相当于 {0,},比如:"\^*b"可以匹配 "b","^^^b"…

    举例1:表达式 "\d+\.?\d*" 在匹配 "It costs $12.5" 时,匹配的结果是:成功;匹配到的内容是:"12.5";匹配到的位置是:开始于10,结束于14。

    举例2:表达式 "go{2,8}gle" 在匹配 "Ads by goooooogle" 时,匹配的结果是:成功;匹配到的内容是:"goooooogle";匹配到的位置是:开始于7,结束于17。


1.6 其他一些代表抽象意义的特殊符号

    一些符号在表达式中代表抽象的特殊意义:

表达式

作用

^

与字符串开始的地方匹配,不匹配任何字符

$

与字符串结束的地方匹配,不匹配任何字符

\b

匹配一个单词边界,也就是单词和空格之间的位置,不匹配任何字符

    进一步的文字说明仍然比较抽象,因此,举例帮助大家理解。

    举例1:表达式 "^aaa" 在匹配 "xxx aaa xxx" 时,匹配结果是:失败。因为 "^" 要求与字符串开始的地方匹配,因此,只有当 "aaa" 位于字符串的开头的时候,"^aaa" 才能匹配,比如:"aaa xxx xxx"

    举例2:表达式 "aaa$" 在匹配 "xxx aaa xxx" 时,匹配结果是:失败。因为 "$" 要求与字符串结束的地方匹配,因此,只有当 "aaa" 位于字符串的结尾的时候,"aaa$" 才能匹配,比如:"xxx xxx aaa"

    举例3:表达式 ".\b." 在匹配 "@@@abc" 时,匹配结果是:成功;匹配到的内容是:"@a";匹配到的位置是:开始于2,结束于4。
    进一步说明:"\b" 与 "^" 和 "$" 类似,本身不匹配任何字符,但是它要求它在匹配结果中所处位置的左右两边,其中一边是 "\w" 范围,另一边是 非"\w" 的范围。

    举例4:表达式 "\bend\b" 在匹配 "weekend,endfor,end" 时,匹配结果是:成功;匹配到的内容是:"end";匹配到的位置是:开始于15,结束于18。

    一些符号可以影响表达式内部的子表达式之间的关系:

表达式

作用

|

左右两边表达式之间 "或" 关系,匹配左边或者右边

( )

(1). 在被修饰匹配次数的时候,括号中的表达式可以作为整体被修饰
(2). 取匹配结果的时候,括号中的表达式匹配到的内容可以被单独得到

    举例5:表达式 "Tom|Jack" 在匹配字符串 "I’m Tom, he is Jack" 时,匹配结果是:成功;匹配到的内容是:"Tom";匹配到的位置是:开始于4,结束于7。匹配下一个时,匹配结果是:成功;匹配到的内容是:"Jack";匹配到的位置时:开始于15,结束于19。

    举例6:表达式 "(go\s*)+" 在匹配 "Let’s go go go!" 时,匹配结果是:成功;匹配到内容是:"go go go";匹配到的位置是:开始于6,结束于14。

    举例7:表达式 "(\d+\.?\d*)" 在匹配 "$10.9,¥20.5" 时,匹配的结果是:成功;匹配到的内容是:"¥20.5";匹配到的位置是:开始于6,结束于10。单独获取括号范围匹配到的内容是:"20.5"。


2. 正则表达式中的一些高级规则

2.1 匹配次数中的贪婪与非贪婪

    在使用修饰匹配次数的特殊符号时,有几种表示方法可以使同一个表达式能够匹配不同的次数,比如:"{m,n}", "{m,}", "?", "*", "+",具体匹配的次数随被匹配的字符串而定。这种重复匹配不定次数的表达式在匹配过程中,总是尽可能多的匹配。比如,针对文本 "dxxxdxxxd",举例如下:

表达式

匹配结果

(d)(\w+)

"\w+" 将匹配第一个 "d" 之后的所有字符 "xxxdxxxd"

(d)(\w+)(d)

"\w+" 将匹配第一个 "d" 和最后一个 "d" 之间的所有字符 "xxxdxxx"。虽然 "\w+" 也能够匹配上最后一个 "d",但是为了使整个表达式匹配成功,"\w+" 可以 "让出" 它本来能够匹配的最后一个 "d"

    由此可见,"\w+" 在匹配的时候,总是尽可能多的匹配符合它规则的字符。虽然第二个举例中,它没有匹配最后一个 "d",但那也是为了让整个表达式能够匹配成功。同理,带 "*" 和 "{m,n}" 的表达式都是尽可能地多匹配,带 "?" 的表达式在可匹配可不匹配的时候,也是尽可能的 "要匹配"。这 种匹配原则就叫作 "贪婪" 模式 。

    非贪婪模式:

    在修饰匹配次数的特殊符号后再加上一个 "?" 号,则可以使匹配次数不定的表达式尽可能少的匹配,使可匹配可不匹配的表达式,尽可能的 "不匹配"。这种匹配原则叫作 "非贪婪" 模式,也叫作 "勉强" 模式。如果少匹配就会导致整个表达式匹配失败的时候,与贪婪模式类似,非贪婪模式会最小限度的再匹配一些,以使整个表达式匹配成功。举例如下,针对文本 "dxxxdxxxd" 举例:

表达式

匹配结果

(d)(\w+?)

"\w+?" 将尽可能少的匹配第一个 "d" 之后的字符,结果是:"\w+?" 只匹配了一个 "x"

(d)(\w+?)(d)

为了让整个表达式匹配成功,"\w+?" 不得不匹配 "xxx" 才可以让后边的 "d" 匹配,从而使整个表达式匹配成功。因此,结果是:"\w+?" 匹配 "xxx"

    更多的情况,举例如下:

    举例1:表达式 "<td>(.*)</td>" 与字符串 "<td><p>aa</p></td> <td><p>bb</p></td>" 匹配时,匹配的结果是:成功;匹配到的内容是 "<td><p>aa</p></td> <td><p>bb</p></td>" 整个字符串, 表达式中的 "</td>" 将与字符串中最后一个 "</td>" 匹配。

    举例2:相比之下,表达式 "<td>(.*?)</td>" 匹配举例1中同样的字符串时,将只得到 "<td><p>aa</p></td>", 再次匹配下一个时,可以得到第二个 "<td><p>bb</p></td>"。


2.2 反向引用 \1, \2…

    表达式在匹配时,表达式引擎会将小括号 "( )" 包含的表达式所匹配到的字符串记录下来。在获取匹配结果的时候,小括号包含的表达式所匹配到的字符串可以单独获取。这一点,在前面的举例中,已经多次展示 了。在实际应用场合中,当用某种边界来查找,而所要获取的内容又不包含边界时,必须使用小括号来指定所要的范围。比如前面的 "<td>(.*?)</td>"。

    其实,"小括号包含的表达式所匹配到的字符串" 不仅是在匹配结束后才可以使用,在匹配过程中也可以使用。表达式后边的部分,可以引用前面 "括号内的子匹配已经匹配到的字符串"。引用方法是 "\" 加上一个数字。"\1" 引用第1对括号内匹配到的字符串,"\2" 引用第2对括号内匹配到的字符串……以此类推,如果一对括号内包含另一对括号,则外层的括号先排序号。换句话说,哪一对的左括号 "(" 在前,那这一对就先排序号。

    举例如下:

    举例1:表达式 "(|")(.*?)(\1)" 在匹配 " ‘Hello’, "World" " 时,匹配结果是:成功;匹配到的内容是:" ‘Hello’ "。再次匹配下一个时,可以匹配到 " "World" "。

    举例2:表达式 "(\w)\1{4,}" 在匹配 "aa bbbb abcdefg ccccc 111121111 999999999" 时,匹配结果是:成功;匹配到的内容是 "ccccc"。再次匹配下一个时,将得到 999999999。这个表达式要求 "\w" 范围的字符至少重复5次,注意与 "\w{5,}" 之间的区别

    举例3:表达式 "<(\w+)\s*(\w+(=(|").*?\4)?\s*)*>.*?</\1>" 在匹配 "<td id=’td1′ style="bgcolor:white"></td>" 时,匹配结果是成功。如果 "<td>" 与 "</td>" 不配对,则会匹配失败;如果改成其他配对,也可以匹配成功。


2.3 预搜索,不匹配;反向预搜索,不匹配

    前面的章节中,我讲到了几个代表抽象意义的特殊符号:"^","$","\b"。它们都有一个共同点,那就是:它们本身不匹配任何字符,只是对 "字符串的两头" 或者 "字符之间的缝隙" 附加了一个条件。理解到这个概念以后,本节将继续介绍另外一种对 "两头" 或者 "缝隙" 附加条件的,更加灵活的表示方法。

    正向预搜索:"(?=xxxxx)","(?!xxxxx)"

    格式:"(?=xxxxx)",在被匹配的字符串中,它对所处的 "缝隙" 或者 "两头" 附加的条件是:所在缝隙的右侧,必须能够匹配上 xxxxx 这部分的表达式。因为它只是在此作为这个缝隙上附加的条件,所以它并不影响后边的表达式去真正匹配这个缝隙之后的字符。这就类似 "\b",本身不匹配任何字符。"\b" 只是将所在缝隙之前、之后的字符取来进行了一下判断,不会影响后边的表达式来真正的匹配。

    举例1:表达式 "Windows (?=NT|XP)" 在匹配 "Windows 98, Windows NT, Windows 2000" 时,将只匹配 "Windows NT" 中的 "Windows ",其他的 "Windows " 字样则不被匹配。

    举例2:表达式 "(\w)((?=\1\1\1)(\1))+" 在匹配字符串 "aaa ffffff 999999999" 时,将可以匹配6个"f"的前4个,可以匹配9个"9"的前7个。这个表达式可以读解成:重复4次以上的字母数字,则匹配其剩下最后2位之前的部分。当然,这个表达式可以不这样写,在此的目的是作为演示之用。

    格式:"(?!xxxxx)",所在缝隙的右侧,必须不能匹配 xxxxx 这部分表达式。

    举例3:表达式 "((?!\bstop\b).)+" 在匹配 "fdjka ljfdl stop fjdsla fdj" 时,将从头一直匹配到 "stop" 之前的位置,如果字符串中没有 "stop",则匹配整个字符串。

    举例4:表达式 "do(?!\w)" 在匹配字符串 "done, do, dog" 时,只能匹配 "do"。在本条举例中,"do" 后边使用 "(?!\w)" 和使用 "\b" 效果是一样的。

    反向预搜索:"(?<=xxxxx)","(?<!xxxxx)"

    这两种格式的概念和正向预搜索是类似的,反向预搜索要求的条件是:所在缝隙的 "左侧",两种格式分别要求必须能够匹配和必须不能够匹配指定表达式,而不是去判断右侧。与 "正向预搜索" 一样的是:它们都是对所在缝隙的一种附加条件,本身都不匹配任何字符。

    举例5:表达式 "(?<=\d{4})\d+(?=\d{4})" 在匹配 "1234567890123456" 时,将匹配除了前4个数字和后4个数字之外的中间8个数字。由于 JScript.RegExp 不支持反向预搜索,因此,本条举例不能够进行演示。很多其他的引擎可以支持反向预搜索,比如:Java 1.4 以上的 java.util.regex 包,.NET 中System.Text.RegularExpressions 命名空间,以及本站推荐的最简单易用的 DEELX 正则引擎


3. 其他通用规则

    还有一些在各个正则表达式引擎之间比较通用的规则,在前面的讲解过程中没有提到。

3.1 表达式中,可以使用 "\xXX" 和 "\uXXXX" 表示一个字符("X" 表示一个十六进制数)

形式

字符范围

\xXX

编号在 0 ~ 255 范围的字符,比如:空格可以使用 "\x20" 表示

\uXXXX

任何字符可以使用 "\u" 再加上其编号的4位十六进制数表示,比如:"\u4E2D"

3.2 在表达式 "\s","\d","\w","\b" 表示特殊意义的同时,对应的大写字母表示相反的意义

表达式

可匹配

\S

匹配所有非空白字符("\s" 可匹配各个空白字符)

\D

匹配所有的非数字字符

\W

匹配所有的字母、数字、下划线以外的字符

\B

匹配非单词边界,即左右两边都是 "\w" 范围或者左右两边都不是 "\w" 范围时的字符缝隙

3.3 在表达式中有特殊意义,需要添加 "\" 才能匹配该字符本身的字符汇总

字符

说明

^

匹配输入字符串的开始位置。要匹配 "^" 字符本身,请使用 "\^"

$

匹配输入字符串的结尾位置。要匹配 "$" 字符本身,请使用 "\$"

( )

标记一个子表达式的开始和结束位置。要匹配小括号,请使用 "\(" 和 "\)"

[ ]

用来自定义能够匹配 ‘多种字符’ 的表达式。要匹配中括号,请使用 "\[" 和 "\]"

{ }

修饰匹配次数的符号。要匹配大括号,请使用 "\{" 和 "\}"

.

匹配除了换行符(\n)以外的任意一个字符。要匹配小数点本身,请使用 "\."

?

修饰匹配次数为 0 次或 1 次。要匹配 "?" 字符本身,请使用 "\?"

+

修饰匹配次数为至少 1 次。要匹配 "+" 字符本身,请使用 "\+"

*

修饰匹配次数为 0 次或任意次。要匹配 "*" 字符本身,请使用 "\*"

|

左右两边表达式之间 "或" 关系。匹配 "|" 本身,请使用 "\|"

3.4 括号 "( )" 内的子表达式,如果希望匹配结果不进行记录供以后使用,可以使用 "(?:xxxxx)" 格式

    举例1:表达式 "(?:(\w)\1)+" 匹配 "a bbccdd efg" 时,结果是 "bbccdd"。括号 "(?:)" 范围的匹配结果不进行记录,因此 "(\w)" 使用 "\1" 来引用。

3.5 常用的表达式属性设置简介:Ignorecase,Singleline,Multiline,Global

表达式属性

说明

Ignorecase

默认情况下,表达式中的字母是要区分大小写的。配置为 Ignorecase 可使匹配时不区分大小写。有的表达式引擎,把 "大小写" 概念延伸至 UNICODE 范围的大小写。

Singleline

默认情况下,小数点 "." 匹配除了换行符(\n)以外的字符。配置为 Singleline 可使小数点可匹配包括换行符在内的所有字符。

Multiline

默认情况下,表达式 "^" 和 "$" 只匹配字符串的开始 ① 和结尾 ④ 位置。如:

①xxxxxxxxx②\n
③xxxxxxxxx④

配置为 Multiline 可以使 "^" 匹配 ① 外,还可以匹配换行符之后,下一行开始前 ③ 的位置,使 "$" 匹配 ④ 外,还可以匹配换行符之前,一行结束 ② 的位置。

Global

主要在将表达式用来替换时起作用,配置为 Global 表示替换所有的匹配。


4. 其他提示

4.1 如果想要了解高级的正则引擎还支持那些复杂的正则语法,可参见本站 DEELX 正则引擎的说明文档

4.2 如果要要求表达式所匹配的内容是整个字符串,而不是从字符串中找一部分,那么可以在表达式的首尾使用 "^" 和 "$",比如:"^\d+$" 要求整个字符串只有数字。

4.3 如果要求匹配的内容是一个完整的单词,而不会是单词的一部分,那么在表达式首尾使用 "\b",比如:使用 "\b(if|while|else|void|int……)\b" 来匹配程序中的关键字

4.4 表达式不要匹配空字符串。否则会一直得到匹配成功,而结果什么都没有匹配到。比如:准备写一个匹配 "123"、"123."、"123.5"、".5" 这几种形式的表达式时,整数、小数点、小数数字都可以省略,但是不要将表达式写成:"\d*\.?\d*",因为如果什么都没有,这个表达式也可以匹配成功。更好的写法是:"\d+\.?\d*|\.\d+"

4.5 能匹配空字符串的子匹配不要循环无限次。如果括号内的子表达式中的每一部分都可以匹配 0 次,而这个括号整体又可以匹配无限次,那么情况可能比上一条所说的更严重,匹配过程中可能死循环。虽然现在有些正则表达式引擎已经通过办法避免了这种情况 出现死循环了,比如 .NET 的正则表达式,但是我们仍然应该尽量避免出现这种情况。如果我们在写表达式时遇到了死循环,也可以从这一点入手,查找一下是否是本条所说的原因。

4.6 合理选择贪婪模式与非贪婪模式,参见话题讨论

4.7 或 "|" 的左右两边,对某个字符最好只有一边可以匹配,这样,不会因为 "|" 两边的表达式因为交换位置而有所不同。


5. 进阶与实战

    有了从本文中掌握的基础,我们可以从实践中进一步巩固我们使用正则表达式的技巧。

5.1 下载正则表达式文档 chm 版本

    [ 点击下载 chm 版本] – DEELX 正则语法,包含其他高级语法的 chm 版本。

5.2 下载正则工具 Regex Match Tracer 2.0 试用版(正版很值得购买)

    [ 下载 Match Tracer] – 471kb

5.3 免费使用 Regex Match Tracer Web 版

    [ 使用 Match Tracer Web 版]

    本 Web 版工具为免费使用,不受 Regex Match Tracer 主程序的试用期限制。

5.4 更多深入话题及使用案例

    [ 关于递归匹配的讨论] – 讨论如何使用不支持递归的正则引擎匹配嵌套结构

    [ 有问题与站长交流] – 与站长交流和讨论

    [ 本页脚本] – 本页的“关闭高亮”功能,采用 javascript 的正则表达式实现的。

        比如表达式: (a+b|[cd])$

IT技术

正则表达式快速入门教程

2009年8月23日
正则表达式快速入门教程已关闭评论

正则表达式快速入门教程目录

跳过目录

  1. 本文目标
  2. 如何使用本教程
  3. 正则表达式到底是什么东西?
  4. 入门
  5. 测试正则表达式
  6. 元字符
  7. 字符转义
  8. 重复
  9. 字符类
  10. 分枝条件
  11. 反义
  12. 分组
  13. 后向引用
  14. 零宽断言
  15. 负向零宽断言
  16. 注释
  17. 贪婪与懒惰
  18. 处理选项
  19. 平衡组/递归匹配

本文目标

30分钟内让你明白正则表达式是什么,并对它有一些基本的了解,让你可以在自己的程序或网页里使用它。

如何使用本教程

最重要的是–请给我30分钟,如果你没有使用正则表达式的经验,请不要试图在30内入门–除非你是超人 🙂

别被下面那些复杂的表达式吓倒,只要跟着我一步一步来,你会发现正则表达式其实并没有你想像中的那么困难。当然,如果你看完了这篇教程之后,发现自己明白了很多,却又几乎什么都记不得,那也是很正常的–我认为,没接触过正则表达式的人在看完这篇教程后,能把提到过的语法记住80%以上的可能性为零。这里只是让你明白基本的原理,以后你还需要多练习,多使用,才能熟练掌握正则表达式。

除了作为入门教程之外,本文还试图成为可以在日常工作中使用的正则表达式语法参考手册。就作者本人的经历来说,这个目标还是完成得不错的–你看,我自己也没能把所有的东西记下来,不是吗?

清除格式 文本格式约定:专业术语 元字符/语法格式 正则表达式 正则表达式中的一部分(用于分析) 对其进行匹配的源字符串 对正则表达式或其中一部分的说明

隐藏边注 本文右边有一些注释,主要是用来提供一些相关信息,或者给没有程序员背景的读者解释一些基本概念,通常可以忽略。

正则表达式到底是什么东西?

字符是计算机软件处理文字时最基本的单位,可能是字母,数字,标点符号,空格,换行符,汉字等等。字符串是0个或更多个字符的序列。文本也就是文字,字符串。说某个字符串匹配某个正则表达式,通常是指这个字符串里有一部分(或几部分分别)能满足表达式给出的条件。

在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。换句话说,正则表达式就是记录文本规则的代码。

很可能你使用过Windows/Dos下用于文件查找的通配符(wildcard),也就是*?。如果你想查找某个目录下的所有的Word文档的话,你会搜索*.doc。在这里,*会被解释成任意的字符串。和通配符类似,正则表达式也是用来进行文本匹配的工具,只不过比起通配符,它能更精确地描述你的需求–当然,代价就是更复杂–比如你可以编写一个正则表达式,用来查找所有以0开头,后面跟着2-3个数字,然后是一个连字号"-",最后是7或8位数字的字符串(像010-123456780376-7654321)。

入门

学习正则表达式的最好方法是从例子开始,理解例子之后再自己对例子进行修改,实验。下面给出了不少简单的例子,并对它们作了详细的说明。

假设你在一篇英文小说里查找hi,你可以使用正则表达式hi

这几乎是最简单的正则表达式了,它可以精确匹配这样的字符串:由两个字符组成,前一个字符是h,后一个是i。通常,处理正则表达式的工具会提供一个忽略大小写的选项,如果选中了这个选项,它可以匹配hi,HI,Hi,hI这四种情况中的任意一种。

不幸的是,很多单词里包含hi这两个连续的字符,比如him,history,high等等。用hi来查找的话,这里边的hi也会被找出来。如果要精确地查找hi这个单词的话,我们应该使用\bhi\b

\b是正则表达式规定的一个特殊代码(好吧,某些人叫它元字符,metacharacter),代表着单词的开头或结尾,也就是单词的分界处。虽然通常英文的单词是由空格,标点符号或者换行来分隔的,但是\b并不匹配这些单词分隔字符中的任何一个,它只匹配一个位置

如果需要更精确的说法,\b匹配这样的位置:它的前一个字符和后一个字符不全是(一个是,一个不是或不存在)\w

假如你要找的是hi后面不远处跟着一个Lucy,你应该用\bhi\b.*\bLucy\b

这里,.是另一个元字符,匹配除了换行符以外的任意字符*同样是元字符,不过它代表的不是字符,也不是位置,而是数量–它指定*前边的内容可以连续重复使用任意次以使整个表达式得到匹配。因此,.*连在一起就意味着任意数量的不包含换行的字符。现在\bhi\b.*\bLucy\b的意思就很明显了:先是一个单词hi,然后是任意个任意字符(但不能是换行),最后是Lucy这个单词

换行符就是’\n’,ASCII编码为10(十六进制0x0A)的字符。

如果同时使用其它元字符,我们就能构造出功能更强大的正则表达式。比如下面这个例子:

0\d\d-\d\d\d\d\d\d\d\d匹配这样的字符串:以0开头,然后是两个数字,然后是一个连字号"-",最后是8个数字(也就是中国的电话号码。当然,这个例子只能匹配区号为3位的情形)。

这里的\d是个新的元字符,匹配一位数字(0,或1,或2,或……)不是元字符,只匹配它本身–连字符(或者减号,或者中横线,或者随你怎么称呼它)。

为了避免那么多烦人的重复,我们也可以这样写这个表达式:0\d{2}-\d{8}。 这里\d后面的{2}({8})的意思是前面\d必须连续重复匹配2次(8次)

测试正则表达式

如果你不觉得正则表达式很难读写的话,要么你是一个天才,要么,你不是地球人。正则表达式的语法很令人头疼,即使对经常使用它的人来说也是如此。由于难于读写,容易出错,所以找一种工具对正则表达式进行测试是很有必要的。

不同的环境下正则表达式的一些细节是不相同的,本教程介绍的是微软 .Net Framework 2.0下正则表达式的行为,所以,我向你介绍一个.Net下的工具Regex Tester。首先你确保已经安装了.Net Framework 2.0,然后下载Regex Tester。这是个绿色软件,下载完后打开压缩包,直接运行RegexTester.exe就可以了。

下面是Regex Tester运行时的截图:

Regex Tester运行时的截图

元字符

现在你已经知道几个很有用的元字符了,如\b,.,*,还有\d.正则表达式里还有更多的元字符,比如\s匹配任意的空白符,包括空格,制表符(Tab),换行符,中文全角空格等\w匹配字母或数字或下划线或汉字等

对中文/汉字的特殊处理是由.Net提供的正则表达式引擎支持的,其它环境下的具体情况请查看相关文档。

下面来看看更多的例子:

\ba\w*\b匹配以字母a开头的单词–先是某个单词开始处(\b),然后是字母a,然后是任意数量的字母或数字(\w*),最后是单词结束处(\b)

好吧,现在我们说说正则表达式里的单词是什么意思吧:就是不少于一个的连续的\w。不错,这与学习英文时要背的成千上万个同名的东西的确关系不大 🙂

\d+匹配1个或更多连续的数字。这里的+是和*类似的元字符,不同的是*匹配重复任意次(可能是0次),而+则匹配重复1次或更多次

\b\w{6}\b 匹配刚好6个字符的单词

表1.常用的元字符
代码 说明
. 匹配除换行符以外的任意字符
\w 匹配字母或数字或下划线或汉字
\s 匹配任意的空白符
\d 匹配数字
\b 匹配单词的开始或结束
^ 匹配字符串的开始
$ 匹配字符串的结束

正则表达式引擎通常会提供一个"测试指定的字符串是否匹配一个正则表达式"的方法,如JavaScript里的RegExp.test()方法或.NET里的Regex.IsMatch()方法。这里的匹配是指是字符串里有没有符合表达式规则的部分。如果不使用^$的话,对于\d{5,12}而言,使用这样的方法就只能保证字符串里包含5到12连续位数字,而不是整个字符串就是5到12位数字。

元字符^(和数字6在同一个键位上的符号)和$都匹配一个位置,这和\b有点类似。^匹配你要用来查找的字符串的开头,$匹配结尾。这两个代码在验证输入的内容时非常有用,比如一个网站如果要求你填写的QQ号必须为5位到12位数字时,可以使用:^\d{5,12}$

这里的{5,12}和前面介绍过的{2}是类似的,只不过{2}匹配只能不多不少重复2次{5,12}则是重复的次数不能少于5次,不能多于12次,否则都不匹配。

因为使用了^$,所以输入的整个字符串都要用来和\d{5,12}来匹配,也就是说整个输入必须是5到12个数字,因此如果输入的QQ号能匹配这个正则表达式的话,那就符合要求了。

和忽略大小写的选项类似,有些正则表达式处理工具还有一个处理多行的选项。如果选中了这个选项,^$的意义就变成了匹配行的开始处和结束处

字符转义

如果你想查找元字符本身的话,比如你查找.,或者*,就出现了问题:你没办法指定它们,因为它们会被解释成别的意思。这时你就得使用\来取消这些字符的特殊意义。因此,你应该使用\.\*。当然,要查找\本身,你也得用\\.

例如:unibetter\.com匹配unibetter.comC:\\Windows匹配C:\Windows

重复

你已经看过了前面的*,+,{2},{5,12}这几个匹配重复的方式了。下面是正则表达式中所有的限定符(指定数量的代码,例如*,{5,12}等):

表2.常用的限定符
代码/语法 说明
* 重复零次或更多次
+ 重复一次或更多次
? 重复零次或一次
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次

下面是一些使用重复的例子:

Windows\d+匹配Windows后面跟1个或更多数字

^\w+匹配一行的第一个单词(或整个字符串的第一个单词,具体匹配哪个意思得看选项设置)

字符类

要想查找数字,字母或数字,空白是很简单的,因为已经有了对应这些字符集合的元字符,但是如果你想匹配没有预定义元字符的字符集合(比如元音字母a,e,i,o,u),应该怎么办?

很简单,你只需要在方括号里列出它们就行了,像[aeiou]就匹配任何一个英文元音字母[.?!]匹配标点符号(.或?或!)

我们也可以轻松地指定一个字符范围,像[0-9]代表的含意与\d就是完全一致的:一位数字;同理[a-z0-9A-Z_]也完全等同于\w(如果只考虑英文的话)。

下面是一个更复杂的表达式:\(?0\d{2}[) -]?\d{8}

"("和")"也是元字符,后面的分组节里会提到,所以在这里需要使用转义

这个表达式可以匹配几种格式的电话号码,像(010)88886666,或022-22334455,或02912345678等。我们对它进行一些分析吧:首先是一个转义字符\(,它能出现0次或1次(?),然后是一个0,后面跟着2个数字(\d{2}),然后是)空格中的一个,它出现1次或不出现(?),最后是8个数字(\d{8})。

分枝条件

不幸的是,刚才那个表达式也能匹配010)12345678(022-87654321这样的"不正确"的格式。要解决这个问题,我们需要用到分枝条件。正则表达式里的分枝条件指的是有几种规则,如果满足其中任意一种规则都应该当成匹配,具体方法是用|把不同的规则分隔开。听不明白?没关系,看例子:

0\d{2}-\d{8}|0\d{3}-\d{7}这个表达式能匹配两种以连字号分隔的电话号码:一种是三位区号,8位本地号(如010-12345678),一种是4位区号,7位本地号(0376-2233445)

\(0\d{2}\)[- ]?\d{8}|0\d{2}[- ]?\d{8}这个表达式匹配3位区号的电话号码,其中区号可以用小括号括起来,也可以不用,区号与本地号间可以用连字号或空格间隔,也可以没有间隔。你可以试试用分枝条件把这个表达式扩展成也支持4位区号的。

\d{5}-\d{4}|\d{5}这个表达式用于匹配美国的邮政编码。美国邮编的规则是5位数字,或者用连字号间隔的9位数字。之所以要给出这个例子是因为它能说明一个问题:使用分枝条件时,要注意各个条件的顺序。如果你把它改成\d{5}|\d{5}-\d{4}的话,那么就只会匹配5位的邮编(以及9位邮编的前5位)。原因是匹配分枝条件时,将会从左到右地测试每个条件,如果满足了某个分枝的话,就不会去再管其它的条件了。

分组

我们已经提到了怎么重复单个字符(直接在字符后面加上限定符就行了);但如果想要重复多个字符又该怎么办?你可以用小括号来指定子表达式(也叫做分组),然后你就可以指定这个子表达式的重复次数了,你也可以对子表达式进行其它一些操作(后面会有介绍)。

(\d{1,3}\.){3}\d{1,3}是一个简单的IP地址匹配表达式。要理解这个表达式,请按下列顺序分析它:\d{1,3}匹配1到3位的数字(\d{1,3}\.){3}匹配三位数字加上一个英文句号(这个整体也就是这个分组)重复3次,最后再加上一个一到三位的数字(\d{1,3})。

IP地址中每个数字都不能大于255,大家千万不要被《24》第三季的编剧给忽悠了……

不幸的是,它也将匹配256.300.888.999这种不可能存在的IP地址。如果能使用算术比较的话,或许能简单地解决这个问题,但是正则表达式中并不提供关于数学的任何功能,所以只能使用冗长的分组,选择,字符类来描述一个正确的IP地址:((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)

理解这个表达式的关键是理解2[0-4]\d|25[0-5]|[01]?\d\d?,这里我就不细说了,你自己应该能分析得出来它的意义。

反义

有时需要查找不属于某个能简单定义的字符类的字符。比如想查找除了数字以外,其它任意字符都行的情况,这时需要用到反义

表3.常用的反义代码
代码/语法 说明
\W 匹配任意不是字母,数字,下划线,汉字的字符
\S 匹配任意不是空白符的字符
\D 匹配任意非数字的字符
\B 匹配不是单词开头或结束的位置
[^x] 匹配除了x以外的任意字符
[^aeiou] 匹配除了aeiou这几个字母以外的任意字符

例子:\S+匹配不包含空白符的字符串

<a[^>]+>匹配用尖括号括起来的以a开头的字符串

后向引用

使用小括号指定一个子表达式后,匹配这个子表达式的文本(也就是此分组捕获的内容)可以在表达式或其它程序中作进一步的处理。默认情况下,每个分组会自动拥有一个组号,规则是:从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推。

呃……其实,组号分配还不像我刚说得那么简单:

  • 分组0对应整个正则表达式
  • 实际上组号分配过程是要从左向右扫描两遍的:第一遍只给未命名组分配,第二遍只给命名组分配--因此所有命名组的组号都大于未命名的组号
  • 你可以使用(?:exp)这样的语法来剥夺一个分组对组号分配的参与权.

后向引用用于重复搜索前面某个分组匹配的文本。例如,\1代表分组1匹配的文本。难以理解?请看示例:

\b(\w+)\b\s+\1\b可以用来匹配重复的单词,像go go, 或者kitty kitty。这个表达式首先是一个单词,也就是单词开始处和结束处之间的多于一个的字母或数字(\b(\w+)\b),这个单词会被捕获到编号为1的分组中,然后是1个或几个空白符(\s+),最后是分组1中捕获的内容(也就是前面匹配的那个单词)(\1)。

你也可以自己指定子表达式的组名。要指定一个子表达式的组名,请使用这样的语法:(?<Word>\w+)(或者把尖括号换成也行:(?’Word’\w+)),这样就把\w+的组名指定为Word了。要反向引用这个分组捕获的内容,你可以使用\k<Word>,所以上一个例子也可以写成这样:\b(?<Word>\w+)\b\s+\k<Word>\b

使用小括号的时候,还有很多特定用途的语法。下面列出了最常用的一些:

表4.常用分组语法
分类 代码/语法 说明
捕获 (exp) 匹配exp,并捕获文本到自动命名的组里
(?<name>exp) 匹配exp,并捕获文本到名称为name的组里,也可以写成(?’name’exp)
(?:exp) 匹配exp,不捕获匹配的文本,也不给此分组分配组号
零宽断言 (?=exp) 匹配exp前面的位置
(?<=exp) 匹配exp后面的位置
(?!exp) 匹配后面跟的不是exp的位置
(?<!exp) 匹配前面不是exp的位置
注释 (?#comment) 这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读

我们已经讨论了前两种语法。第三个(?:exp)不会改变正则表达式的处理方式,只是这样的组匹配的内容不会像前两种那样被捕获到某个组里面,也不会拥有组号。"我为什么会想要这样做?"–好问题,你觉得为什么呢?

零宽断言

地球人,是不是觉得这些术语名称太复杂,太难记了?我也有同感。知道有这么一种东西就行了,它叫什么,随它去吧!人若无名,便可专心练剑;物若无名,便可随意取舍……

接下来的四个用于查找在某些内容(但并不包括这些内容)之前或之后的东西,也就是说它们像\b,^,$那样用于指定一个位置,这个位置应该满足一定的条件(即断言),因此它们也被称为零宽断言。最好还是拿例子来说明吧:

断言用来声明一个应该为真的事实。正则表达式中只有当断言为真时才会继续进行匹配。

(?=exp)也叫零宽度正预测先行断言,它断言自身出现的位置的后面能匹配表达式exp。比如\b\w+(?=ing\b),匹配以ing结尾的单词的前面部分(除了ing以外的部分),如查找I’m singing while you’re dancing.时,它会匹配singdanc

(?<=exp)也叫零宽度正回顾后发断言,它断言自身出现的位置的前面能匹配表达式exp。比如(?<=\bre)\w+\b会匹配以re开头的单词的后半部分(除了re以外的部分),例如在查找reading a book时,它匹配ading

假如你想要给一个很长的数字中每三位间加一个逗号(当然是从右边加起了),你可以这样查找需要在前面和里面添加逗号的部分:((?<=\d)\d{3})+\b,用它对1234567890进行查找时结果是234567890

下面这个例子同时使用了这两种断言:(?<=\s)\d+(?=\s)匹配以空白符间隔的数字(再次强调,不包括这些空白符)

负向零宽断言

前面我们提到过怎么查找不是某个字符或不在某个字符类里的字符的方法(反义)。但是如果我们只是想要确保某个字符没有出现,但并不想去匹配它时怎么办?例如,如果我们想查找这样的单词–它里面出现了字母q,但是q后面跟的不是字母u,我们可以尝试这样:

\b\w*q[^u]\w*\b匹配包含后面不是字母u的字母q的单词。但是如果多做测试(或者你思维足够敏锐,直接就观察出来了),你会发现,如果q出现在单词的结尾的话,像Iraq,Benq,这个表达式就会出错。这是因为[^u]总要匹配一个字符,所以如果q是单词的最后一个字符的话,后面的[^u]将会匹配q后面的单词分隔符(可能是空格,或者是句号或其它的什么),后面的\w*\b将会匹配下一个单词,于是\b\w*q[^u]\w*\b就能匹配整个Iraq fighting负向零宽断言能解决这样的问题,因为它只匹配一个位置,并不消费任何字符。现在,我们可以这样来解决这个问题:\b\w*q(?!u)\w*\b

零宽度负预测先行断言(?!exp)断言此位置的后面不能匹配表达式exp。例如:\d{3}(?!\d)匹配三位数字,而且这三位数字的后面不能是数字\b((?!abc)\w)+\b匹配不包含连续字符串abc的单词

同理,我们可以用(?<!exp),零宽度负回顾后发断言断言此位置的前面不能匹配表达式exp(?<![a-z])\d{7}匹配前面不是小写字母的七位数字

请详细分析表达式(?<=<(\w+)>).*(?=<\/\1>),这个表达式最能表现零宽断言的真正用途。

一个更复杂的例子:(?<=<(\w+)>).*(?=<\/\1>)匹配不包含属性的简单HTML标签内里的内容(<?(\w+)>)指定了这样的前缀被尖括号括起来的单词(比如可能是<b>),然后是.*(任意的字符串),最后是一个后缀(?=<\/\1>)。注意后缀里的\/,它用到了前面提过的字符转义;\1则是一个反向引用,引用的正是捕获的第一组,前面的(\w+)匹配的内容,这样如果前缀实际上是<b>的话,后缀就是</b>了。整个表达式匹配的是<b>和</b>之间的内容(再次提醒,不包括前缀和后缀本身)。

注释

小括号的另一种用途是通过语法(?#comment)来包含注释。例如:2[0-4]\d(?#200-249)|25[0-5](?#250-255)|[01]?\d\d?(?#0-199)

要包含注释的话,最好是启用"忽略模式里的空白符"选项,这样在编写表达式时能任意的添加空格,Tab,换行,而实际使用时这些都将被忽略。启用这个选项后,在#后面到这一行结束的所有文本都将被当成注释忽略掉。例如,我们可以前面的一个表达式写成这样:

      (?<=    # 断言要匹配的文本的前缀
      <(\w+)> # 查找尖括号括起来的字母或数字(即HTML/XML标签)
      )       # 前缀结束
      .*      # 匹配任意文本
      (?=     # 断言要匹配的文本的后缀
      <\/\1>  # 查找尖括号括起来的内容:前面是一个"/",后面是先前捕获的标签
      )       # 后缀结束

贪婪与懒惰

当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符。以这个表达式为例:a.*b,它将会匹配最长的以a开始,以b结束的字符串。如果用它来搜索aabab的话,它会匹配整个字符串aabab。这被称为贪婪匹配。

有时,我们更需要懒惰匹配,也就是匹配尽可能少的字符。前面给出的限定符都可以被转化为懒惰匹配模式,只要在它后面加上一个问号?。这样.*?就意味着匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复。现在看看懒惰版的例子吧:

a.*?b匹配最短的,以a开始,以b结束的字符串。如果把它应用于aabab的话,它会匹配aab(第一到第三个字符)ab(第四到第五个字符)

为什么第一个匹配是aab(第一到第三个字符)而不是ab(第二到第三个字符)?简单地说,因为正则表达式有另一条规则,比懒惰/贪婪规则的优先级更高:最先开始的匹配拥有最高的优先权–The match that begins earliest wins。

表5.懒惰限定符
代码/语法 说明
*? 重复任意次,但尽可能少重复
+? 重复1次或更多次,但尽可能少重复
?? 重复0次或1次,但尽可能少重复
{n,m}? 重复n到m次,但尽可能少重复
{n,}? 重复n次以上,但尽可能少重复

处理选项

在C#中,你可以使用Regex(String, RegexOptions)构造函数来设置正则表达式的处理选项。如:Regex regex = new Regex(@"\ba\w{6}\b", RegexOptions.IgnoreCase);

上面介绍了几个选项如忽略大小写,处理多行等,这些选项能用来改变处理正则表达式的方式。下面是.Net中常用的正则表达式选项:

表6.常用的处理选项
名称 说明
IgnoreCase(忽略大小写) 匹配时不区分大小写。
Multiline(多行模式) 更改^$的含义,使它们分别在任意一行的行首和行尾匹配,而不仅仅在整个字符串的开头和结尾匹配。(在此模式下,$的精确含意是:匹配\n之前的位置以及字符串结束前的位置.)
Singleline(单行模式) 更改.的含义,使它与每一个字符匹配(包括换行符\n)。
IgnorePatternWhitespace(忽略空白) 忽略表达式中的非转义空白并启用由#标记的注释。
ExplicitCapture(显式捕获) 仅捕获已被显式命名的组。

一个经常被问到的问题是:是不是只能同时使用多行模式和单行模式中的一种?答案是:不是。这两个选项之间没有任何关系,除了它们的名字比较相似(以至于让人感到疑惑)以外。

平衡组/递归匹配

这里介绍的平衡组语法是由.Net Framework支持的;其它语言/库不一定支持这种功能,或者支持此功能但需要使用不同的语法。

有时我们需要匹配像( 100 * ( 50 + 15 ) )这样的可嵌套的层次性结构,这时简单地使用\(.+\)则只会匹配到最左边的左括号和最右边的右括号之间的内容(这里我们讨论的是贪婪模式,懒惰模式也有下面的问题)。假如原来的字符串里的左括号和右括号出现的次数不相等,比如( 5 / ( 3 + 2 ) ) ),那我们的匹配结果里两者的个数也不会相等。有没有办法在这样的字符串里匹配到最长的,配对的括号之间的内容呢?

为了避免(\(把你的大脑彻底搞糊涂,我们还是用尖括号代替圆括号吧。现在我们的问题变成了如何把xx <aa <bbb> <bbb> aa> yy这样的字符串里,最长的配对的尖括号内的内容捕获出来?

这里需要用到以下的语法构造:

  • (?’group’) 把捕获的内容命名为group,并压入堆栈(Stack)
  • (?’-group’) 从堆栈上弹出最后压入堆栈的名为group的捕获内容,如果堆栈本来为空,则本分组的匹配失败
  • (?(group)yes|no) 如果堆栈上存在以名为group的捕获内容的话,继续匹配yes部分的表达式,否则继续匹配no部分
  • (?!) 零宽负向先行断言,由于没有后缀表达式,试图匹配总是失败

如果你不是一个程序员(或者你自称程序员但是不知道堆栈是什么东西),你就这样理解上面的三种语法吧:第一个就是在黑板上写一个"group",第二个就是从黑板上擦掉一个"group",第三个就是看黑板上写的还有没有"group",如果有就继续匹配yes部分,否则就匹配no部分。

我们需要做的是每碰到了左括号,就在压入一个"Open",每碰到一个右括号,就弹出一个,到了最后就看看堆栈是否为空--如果不为空那就证明左括号比右括号多,那匹配就应该失败。正则表达式引擎会进行回溯(放弃最前面或最后面的一些字符),尽量使整个表达式得到匹配。

<                         #最外层的左括号
    [^<>]*                #最外层的左括号后面的不是括号的内容
    (
        (
            (?'Open'<)    #碰到了左括号,在黑板上写一个"Open"
            [^<>]*       #匹配左括号后面的不是括号的内容
        )+
        (
            (?'-Open'>)   #碰到了右括号,擦掉一个"Open"
            [^<>]*        #匹配右括号后面不是括号的内容
        )+
    )*
    (?(Open)(?!))         #在遇到最外层的右括号前面,判断黑板上还有没有没擦掉的"Open";如果还有,则匹配失败

>                         #最外层的右括号

平衡组的一个最常见的应用就是匹配HTML,下面这个例子可以匹配嵌套的<div>标签<div[^>]*>[^<>]*(((?’Open'<div[^>]*>)[^<>]*)+((?’-Open'</div>)[^<>]*)+)*(?(Open)(?!))</div>.

还有些什么东西没提到

上边已经描述了构造正则表达式的大量元素,但是还有很多没有提到的东西。下面是一些未提到的元素的列表,包含语法和简单的说明。你可以在网上找到更详细的参考资料来学习它们–当你需要用到它们的时候。如果你安装了MSDN Library,你也可以在里面找到.net下正则表达式详细的文档。

这里的介绍很简略,如果你需要更详细的信息,而又没有在电脑上安装MSDN Library,可以查看关于正则表达式语言元素的MSDN在线文档

表7.尚未详细讨论的语法
代码/语法 说明
\a 报警字符(打印它的效果是电脑嘀一声)
\b 通常是单词分界位置,但如果在字符类里使用代表退格
\t 制表符,Tab
\r 回车
\v 竖向制表符
\f 换页符
\n 换行符
\e Escape
\0nn ASCII代码中八进制代码为nn的字符
\xnn ASCII代码中十六进制代码为nn的字符
\unnnn Unicode代码中十六进制代码为nnnn的字符
\cN ASCII控制字符。比如\cC代表Ctrl+C
\A 字符串开头(类似^,但不受处理多行选项的影响)
\Z 字符串结尾或行尾(不受处理多行选项的影响)
\z 字符串结尾(类似$,但不受处理多行选项的影响)
\G 当前搜索的开头
\p{name} Unicode中命名为name的字符类,例如\p{IsGreek}
(?>exp) 贪婪子表达式
(?<x>-<y>exp) 平衡组
(?im-nsx:exp) 在子表达式exp中改变处理选项
(?im-nsx) 为表达式后面的部分改变处理选项
(?(exp)yes|no) 把exp当作零宽正向先行断言,如果在这个位置能匹配,使用yes作为此组的表达式;否则使用no
(?(exp)yes) 同上,只是使用空表达式作为no
(?(name)yes|no) 如果命名为name的组捕获到了内容,使用yes作为表达式;否则使用no
(?(name)yes) 同上,只是使用空表达式作为no

C#, IT技术

流行wiki源代码下载

2009年8月22日
流行wiki源代码下载已关闭评论

流行wiki源代码下载

 

Wiki 是一个协同著作平台或称开放编辑系统。所谓协同工作, 即它能够让浏览网页的人都能够去修订网页,其简介的 … Wiki 是什么做到的. Wiki 使用 了简化的语法,替代复杂的HTML,加上WEB 界面的编辑工具,降低内容维护的门槛; ……
相信很多的站长都需要WiKi,我们可以用Wiki来建设帮助系统,知识系统,松散的讨论平台,甚至收藏夹……
在这里我推荐几款常用的WiKi程序。

一,ASP的WiKi程序。ASP的WiKi程序总体感觉比较弱,或许开放的WiKi更喜欢开放的linux系统吧
1,Operator Wiki 0.3
语言环境:ASP+ACCESS
官方主页:http://cosoft.org.cn/projects/operatorwiki/
演示:http://my.yeew.net/maxzone/operatorwiki/wiki.asp
下载:http://down2.codepub.com/codepubcom/2006/4/8/operatorwik03.rar
介绍:免费开源的国产WIKI程序,ASP+JavaScript写的 Wiki 引擎,支持多语言、ACL,综合各种 WIKI 的功能。
Operator Wiki 升级日志0.3:.
* 完整的用户权限
* 支持 ACL 进行权限控制
* 修正了一个标记冲突问题
* 修正登录问题
* 源代码采用 Tab 代替空格,进一步缩小体积,主程序目前仅 34.4K
* 更良好的多语言支持
* 修正数十个关于表格和列表的问题

2,OpenWiki 中文版Build20060328
语言环境:ASP+ACCESS/SQLServer
官方主页:http://www.openwiki.com/
演示:http://www.3d-gis.com/yow/
下载:http://down2.codepub.com/codepubcom/2006/4/8/openviki_yow.rar
介绍:国外的一个ASP Wiki程序,3d-gis汉化。

3,JsWiki – 开源ASP WIKI程序
语言环境:ASP
官方主页:http://sourceforge.net/projects/jswiki/
演示:http://www.jswiki.com/
下载:http://down2.codepub.com/codepubcom/2006/2/10/jswiki.rar
介绍:安装只需要一个文件jswiki.asp
使用javascript写成,能够运行于任何一台支持asp的windows主机
支持丰富而方便的text语法(混合了标准wiki/textile/markdown三种常见文法)
支持页面的历史记录和版本差异
支持页面锁定和保密
支持RSS输出最近更新内容
提供InterWiki?链接
使用宏提供额外的功能和扩展

二,CGI的WiKi程序
4,TWiki Release 4.0.2
语言环境:Perl
官方主页:http://twiki.org/
演示:http://www.stlchina.org/twiki/bin/view.pl/TWiki/TWikiQickStart
下载:http://down2.codepub.com/codepubcom/2006/4/8/TWiki-4.0.2.tgz
介绍:TWiki是一个开源(GPL)的wiki程序。软件定位为"灵活、强大、易于使用的企业协作平台",运行于Perl环境。
TWiki从2001年开始开发,大约每年发行一个重要版本。最新稳定版本为2004-9-4版本,最新beta版本为2006-01-31版本。
Twiki被很多大型商业公司采用,例如Yahoo、SAP、Motorola、Wind River等。
TWiki的官方站点内容有版权,TWiki名称是Peter Thoeny所有的一个注册商标,内容的贡献属于Peter Thoeny和其贡献者共同所有。
TWiki的特点:
TWiki是一个功能完善的wiki系统
专注于为网站赋予结构,所有页面自动归为TWiki Web,这样就很容易创建协作小组。拥有编程技能的人可以使用变量创建动态页面,譬如内容表格,或者嵌入式搜索结果的页面。
易于定制和扩展
允许页面编辑:Darkar版本已经支持所见即所得编辑。
访问控制: 细化的授权机制让管理员可以限制不同部门的读写访问权限。
TWIKI完全是一个不需要任何数据库,完全基于文件目录的格式化引擎。

5,UseModWiki Version 1.0
语言环境:Perl
官方主页:http://www.usemod.com/
演示:http://www.usemod.com/
下载:http://down2.codepub.com/codepubcom/2006/4/8/usemod10.tar.gz
介绍:September 12, 2003: Version 1.0,官方应该是停止了更新!
UseModWiki(Usenet Moderation Project (Usemod))是Clifford Adams 所开发的维基引擎,它采用Perl做为开发的程序语言,它最大的特点是不使用任何的数据库管理系统来储存页面内容,任何的新增页面都直接储存于档案系统内,维基百科曾采用UseModWiki做为所有语言版本的维基引擎,之后才自行开发MediaWiki做为现有的接口。
功能特色:
采取单一档案就可以运作
不需要任何的延伸扩充程序
所有的变量都直接撰写于程序码中
页面直接储存于档案系统
采用CamelCase的连结样式
可透过对照表而修改其显示语言

三,PHP的WiKi程序
6,MediaWiki 1.6.2 -应用最广的WiKi程序
语言环境:PHP+MySQL
官方主页:http://www.mediawiki.org/
演示:http://www.mediawiki.org/
下载:http://down2.codepub.com/codepub … iawiki-1.6.2.tar.gz
介绍:MediaWiki全球最著名的开源wiki引擎,运行于PHP+MySQL环境。从2002年2月25日被作为维基百科全书的系统软件,并有大量其他应用实例。目前MediaWiki的开发得到维基媒体基金会的支持。
wiki的重要特征
记录所有的改动版本,能方便的查阅历史更新记录,这使得开放性编辑成为可能
自动产生链接,编辑文本中中括号中的内容(如"[[X条目]]")将自动产生链接
允许使用模板,方便对相同内容的重复使用、更新
支持分类,并根据分类在不同的文章之间自动产生关联
允许每个用户自行选择系统外观
中文支持好

7,Tikiwiki v1.9.2 多国语言版 – 又是WiKi又是CMS系统
语言环境:PHP+MySQL
官方主页:http://tikiwiki.org/
演示:http://tikiwiki.org/
下载:http://down2.codepub.com/codepubcom/2005/11/13/tikiwiki192.rar
介绍:非常优秀的网站内容管理系统,基于 PHP+ADOdb+Smarty等技术构建,功能非常齐全,主要特点:
1、有文章、论坛、分类目录、blog、图库、文件下载、在线调查、Wiki等功能。
2、用户权限管理很棒,可以设置启用哪些功能,设置哪些用户使用哪些功能。
3、管理后台和用户界面合在一起,通过用户权限控制界面的显示。
4、界面被分割成上中下、左中右区域,非常结构化。
5、有很多实用模块,如菜单、登录、搜索、在线调查、最新发表文章等等,可以灵活定制显示在左右界面区域。
6、界面很简洁,有很多界面模版来换肤。

8,CooCooWakka v0.09 rc3 – 国人开放的PHP WiKi程序
语言环境:PHP+MySQL
官方主页:http://coo.hsfz.net/wiki/
演示:[url]http://coo.hsfz.net/wiki/[/[/url]
下载:http://down2.codepub.com/codepubcom/2006/3/6/CooCooWakka.tar.gz
介绍:文wiki引擎程序,2004年被很多网站采用。2004年9月后基本停止更新,一直到2005年7月发布v0.0.9rc1,2006年2开发布0.0.9rc3,支持PHP5。
CooCooWakka是咕咕基于WakkaWiki 0.1.2进行修改强化而来。
CooCooWakka从2003年开始开发,作为CooYip的一项业余小爱好,现在CooCooWakka也是cosoft.org.cn和sourceforge.net的开源项目。至今(2005年4月)已经发布了8个主要的版本。
CooCooWakka是一种重于合作的超文本编辑环境(基于PHP+MYSQL的Wiki引擎),简单来说,对于基于CooCooWakka的网站,任何人(包括你!)都可以在线编辑他的几乎(视管理员意愿)任何页面。CooCooWakka可以用于共笔系统、读书会、档案开发、写书、翻译、资料整理(例如课堂笔记、软件使用资料)、常见问题整理等等。由于其使用及扩展方面的快速便捷,CooCooWakka甚至可以作为小型的CMS系统。
CooCooWakka并不是Wakka的汉化版本,有60%~70%的Wakka代码被CooCooWakka修改或重写(有兴趣的可以比较一下,如果希望得到相似于WakkaWiki?的版本请下载0.0.2,0.0.3,当时自己对修改还是比较节制)。许多特性和策略也有所改变,所以CooCooWakka的站点不支持回复到WakkaWiki?。此外,CooCooWakka也对整个WakkaWiki?进行了多国语言支持化,所以,CooCooWakka支持多种语言–现在提供中文(包括简体gb,utf-8,繁体big5,utf-8),英语的支持。此外,CooCooWakka会自动针对中文站进行功能上的优化。
咕咕最早是在参与WikiPedia的时候对Wiki产生兴趣的,后来也不知道有什么WIKI好用,结果就下载了WAKKA 0.1.2.
结果这套引擎刚好不像MoinMoin或者Tavi那样支持中文,自己就从改charset开始,对wakka0.1.2开始建立自己觉得好用的WikiEngine.本来是本着改给自己用的想法去做CooCooWakka的,结果发现有很多朋友都希望拿份代码试试,也提供了很多好意见,就这样CooCooWakka发展到了现在.(更多历史:History)

9,PhpWiki 1.3.12p2 released
语言环境:PHP
官方主页:http://phpwiki.sourceforge.net/
演示:http://phpwiki.sourceforge.net/p … 83fc0492e961639b13f
下载:http://down2.codepub.com/codepub … iki-1.3.12p2.tar.gz
介绍:无需数据库的小巧WIKI程序。架设简单,权限控制、插件扩展都不错。

10,PmWiki 2.1.5
语言环境:PHP
官方主页:http://www.pmwiki.org/
演示:http://www.emacs.cn/
下载:http://down2.codepub.com/codepubcom/2006/4/8/pmwiki-latest.tgz
介绍:PmWiki,一款用PHP编写的,无需数据库支持的维基,个人网站尤其适合。
在国内还是有不少的应用,演示站点是linuxsir.org旗下一个站点。

四,JSP的WiKi程序
11,JSPWiki stable release v2.2.33
语言环境:JDK+tomcat
官方主页:http://www.jspwiki.org/
演示:http://www.jspwiki.org/wiki/%E4%B8%AD%E6%96%87%E6%96%87%E6%A1%A3
下载:http://down2.codepub.com/codepub … wiki-2.2.33-src.rar
介绍:JSPWiki是一个不错的wiki引擎,纯jsp/servlet写的。JSPWiki不使用现成的数据库管理软件,所有的文件以文本文件的形式存放。它利用类似CVS的机制保证了文件版本的完整性。支持中文,支持版本比较、权限管理等功能!

五,其他WiKi程序
12,MoinMoin 1.5.3 RC1
语言环境:Python
官方主页:http://www.wikiwikiweb.de/
演示:http://www.wikiwikiweb.de/
下载:http://down2.codepub.com/codepub … in-1.5.3-rc1.tar.gz
介绍:MoinMoin是一个基于Python环境的wiki引擎程序,支持包括中文在内的多语种特性。
MoinMoin程序是遵循GNU GPL的开源项目,启动于2000年7月20日,最初由JürgenHermann撰写。最近的版本为2006年02月05日发布的1.5.2,最高稳定版本为1.3.5,并一直保持正常的更新。
MoinMoin可运行在Windows、Linux/BSD/UNIX、OS X等环境下。目前能够处理英文、德文、繁简体中文、日文、俄文等约20种语言。
MoinMoin的特点:
完全使用文件来存储内容,不使用数据库
实现了全部Wiki规范,Unicode编码支持多语种
完整实用的wiki文本约定,编辑规则比较轻巧易学
支持多种扩展方式: 宏,插件,预处理……
为数众多的插件中包括Tex科技文本输入、FreeMind思维图谱、GraphViz示意图、gnuplot数据图表绘图等
支持几种很实用的不同页面样式
真正跨平台

13,TiddlyWiki 2.0.7
语言环境:CSS+HTML+javascript
官方主页:http://www.osmosoft.com/
演示:http://www.tiddlywiki.com/
下载:http://down2.codepub.com/codepubcom/2006/4/8/ptw-2.0.7.rar
介绍:TiddlyWiki是个非常小巧酷炫的wiki引擎,全部程序只是一个一百多K的HTML页面。TiddlyWiki用CSS+HTML+javascript写成,可以在多种浏览器上使用。
TiddlyWiki页面所有元素都能都订制,能方便地修改页面结构和CSS表现形式.它不需要任何服务器端的脚本支持,你要你的电脑有有浏览器就能运行.非常适合放在U盘里到处带着走的个人做记事本。
TiddlyWiki无法真正将数据存储到服务器上,因而不能用来进行团体协作。
一个使用过的用户这样评价TiddlyWiki :
TiddlyWiki是一个好玩的Wiki记事本,支持Tag,支持丰富的Wiki语法,还支持搜索,用来做记事本不错。
它很简单,界面简单、操作简单,文件简单到所有内容只有一个html文件,所以最适合随身携带,想起了以前U盘携带的Wordpress,再带上TiddlyWiki就齐了。
TiddlyWiki是一个纯Javascript操作的Wiki,所有动作都是AJAX的,感觉好酷,要研究AJAX的又多了一个对象。

 

IT技术, 互联网 ,

TMS320DM355 High-Definition (HD) Display

2009年8月17日
TMS320DM355 High-Definition (HD) Display已关闭评论

 

This document describes the system requirements and restrictions for high definition (HD) display while decoding 720P movie and still images.

Contents

[hide]

Introduction

The TMS320DM355 device can encode and decode 720p movies, but a very high DDR bandwidth is needed to display them simultaneously on an HD display. There are a few prerequisites and restrictions in the system to make sure that there are no display glitches during this scenario. This application report is written based on current hardware and software baselines. The restrictions or limitations can be changed according to future software optimizations and hardware improvements.

HD display scenarios

This list briefly summarizes what the DM355 device can and cannot support. More detailed information is discussed in the following sections.

The DM355 CAN support the following HD display scenarios:

  • 720p (1280×720) HD display out
    • Movie playback
      • 720p movie decode with full screen and Video Graphics Array (VGA), Quarter Video Graphics Array (QVGA) movie decode with original size in center of display
    • Still image
      • Slide show with transition effect is possible with full screen
    • Graphical User Interface (GUI)
      • 640×320 size, 8-bit bitmap can fill in full screen with no background job
  • 1080i (1920×1080) HD display out
    • Movie playback
      • 720p, VGA, QVGA movie decode with original size in center of display
    • Still image
      • Slide show with transition effect is possible with full screen
    • GUI
      • 960×540, 8-bit bitmap can fill in full screen with no background job
  • NTSC, PAL TV out
    • Movie playback
      • Super eXtended Video Graphics Array (SXVGA), 720p with full screen and GUI
    • Still image
      • Slide show with transition effect and GUI
    • Movie encoding
      • Full screen preview with GUI while SXVGA, 720p movie encoding
    • GUI
      • No special restrictions or limitations for the GUI implementation

The DM355 CANNOT support the following scenarios:

  • Preview on HD display (even with VGA, QVGA size)
  • HD display during movie encode (even with VGA, QVGA size)
  • Full screen size GUI with background job (movie playback, JPEG decoding, etc.) on HD display

System configuration

HD display with DM355 is supported with the system configurations discussed below.

For Image and Movie Playback Systems With HD Display

These configurations are for systems that need to playback both HD movies and still images. The configurations for movie and still image playback are different in this system, and are provided in the following sections.

Configuration for 720p Movie Playback

  • ARM 270 MHz*
  • DDR 216 MHz** and 8 bank
  • PBBPR*** = 0x30
  • TC RDRATE**** = 0x2

* TMS320DM355-270 is required to run ARM at 270 MHz.
** DDR2 533 MHz DDR module and 270 MHz grade DM355 are required to run DDR at 216 MHz.
*** EMIF Peripheral Bus Burst Priority (PBBPR): 32-bit register at 0x20000020
**** Enhanced Direct Memory Access (EDMA3) Transfer Control Read Rate (TC RDRATE): 32-bit registers at 0x01C10140 and 0x01C10540

This configuration is used for 720p movie playback. It is not possible to resize movies without noise with HD display. 720p movies can be played in full screen size with 720p display; VGA, QVGA size movies are played in their original sizes. 720p movies can be played in their original size with 1080i display.

It is hard to get 30 frames per second (FPS) movie playback if a bigger value than 0x2 is set for TC RDRATE. 0x2 is the highest limit to get for 30 FPS.

0x30 for PBBPR was found with a trial and error method so it is not the best possible value. Memory bandwidth can be utilized more efficiently with a bigger PBBPR value, but peak memory bandwidth can exceed the limitation with bigger PBBPR value in some situations. The best possible value can be changed according to system and application. Start with 0x30 and find good value with trial and error. 0x10 ~ 0x50 would be a good range to cover the best values for almost all systems.

Configuration for Still Image Playback When HD Movie Playback is Needed

  • ARM 270 MHz
  • DDR 216 MHz and 8 bank
  • PBBPR = 0x30
  • TC RDRATE = 0x4

This configuration is used for still image playback. Full screen size still image playback is possible with both 720p and 1080i display. The slide show with transition effect is also possible with both displays. This configuration is useful for the application that requires movie playback as well. Lower ARM and DDR clock can be used for still image playback, to reduce power consumption, but it requires a dynamic-clock-speed changing mechanism. If power consumption is not an issue, then keeping the same clock speed with movie playback is easier to implement and reduces corner cases.

The slide show with transition effect does not have strict real-time constraints like movie playback, so the TC RDRATE value can be adjusted freely. In this configuration with the bigger TC RDRATE value, the transition effects become slower but reduce the possibility of noise. To find the best value for a specific system, start with 0x4 and increase the value with the trial and error method.

For Image Playback Only System With HD Display

The configuration for still image playback is discussed below.

Configuration for Still Image Playback When HD Movie Playback is NOT Needed

  • ARM 108 MHz
  • DDR 171 MHz and 4 bank
  • PBBPR = 0x30
  • TC RDRATE = 0x4
  • IPIPEIF_CFG.CLKDIV = 1/16

This is the minimum configuration to support still image playback and slide show with transition effects for a system that does not need to playback movies on HD display. It means movie playback on the HD display is not supported.

Only 720p display is supported; 1080i is not supported. If 8 bank is used, then 1080i is possible.

ARM 216 MHz has more on-screen display (OSD) line noise than ARM 108 MHz. The reason is that ARM 216 MHz requests memory accesses in shorter periods of time so the peak-of-memory access load is higher. If 8 bank is used, then ARM 216 MHz could be used without any problem.

With this configuration, other values for PBBPR and RDRATE have more visual artifacts. But different systems can show different behavior, so start with the values above and find good values for the system.

If the JPEG size is bigger than the HD display resolution, then IPIPEIF_CFG.CLKDIV does not need to be changed; however, if the JPEG size is smaller than the HD display resolution, then IPIPEIF_CFG.CLKDIV should be set as 1/5, 1/6, 1/8, 1/16 or 1/32. The reason is that scale up requires more bandwidth than scale down. The speed of the Resizer should be reduced. By increasing the clock divider value of IPIPEIF, RESIZE runs more slowly and reduces the required memory bandwidth.

For HD Movie Record System With SD Display

The configuration for the HD movie record system with standard definition display is discussed below.

Configuration for HD Movie Record (minimum configuration)

  • ARM 216 MHz
  • DDR 171 MHz
  • PBBPR = 0x2
  • TC RDRATE = 0x2

Although HD preview is not possible while HD movie encoding, NTSC, PAL or D1 size LCD preview is possible. The above configuration is used to capture an HD movie (720p, SXVGA).

8 bank memory was tested but 4 bank memory has not been tested yet.

GUI With HD Display

There are restrictions to implement GUI with HD Display. The restrictions are explained in this section. Even with the restrictions, some reasonable GUI implementation is possible and those ideas will be discussed in this section, too.

Restrictions

GUI can be implemented with the following configuration.

  • Max size of bitmap window
    • 640×320 for 720p
    • 960×540 for 1080i
  • 2x zoom of the OSD window
  • Only 8 bit or lower bitmaps are supported

GUI has the following limitation.

  • GUI can have blending or transparent effect with video window.
  • While movie playback and slide show, no GUI display is recommended
  • If GUI is required while movie playback and slide show, then a bitmap window size as small as possible is recommended.
  • When there is no background job (movie playback paused, etc.), full screen size GUI can be displayed with above configuration

Using attribute window is not recommended because it greatly increases memory bandwidth.

Although the average memory bandwidth is good enough, the problem is the peak-of-memory bandwidth can exceed the limit and cause visual artifacts on display. GUI increases memory bandwidth significantly. The rule of thumb is not running anything in the background while the GUI menu is shown in the display and to hide the GUI menu before starting anything else. In the case that it is inevitable that an icon is showing while something is running, a bitmap window size as small as possible is recommended.

If noise appears with GUI, then PBBPR and RDRATE values should be readjusted or GUI should be hidden.

GUI Implementation Hints

Even with restrictions in the previous section, there are several ways to implement reasonable GUI on the HD display. They are explained in this section.

Warning
Descriptions in this section are not guaranteed officially. The appropriate sizes and parameters should be found with the specific system.

GUI While Movie Playback

The worst scenario is using 640×320 bitmap and blending full size with the video window. If a GUI is implemented with this method, the GUI can be displayed only when the movie is paused or stopped.

But if a smaller bitmap is used, the following GUI can be shown during movie playback.

Figure 1 GUI with Movie Playback

Figure 1 GUI with Movie Playback

To implement the GUI in Figure 1 during movie playback, the following technique can be used.

The issue is memory bandwidth: more GUI can be added if memory bandwidth increase is not too large. The important aspect is keeping the OSD window size as small as possible. Figure 2 shows how OSD windows can be configured to implement GUI in Figure 1.

Figure 2 OSD Window Configuration

Figure 2 OSD Window Configuration

If only one OSD window is used, then the OSD window size should be able to cover almost all of the display area. But when using two OSD windows, both window sizes can be minimized to cover only the bitmap or text. With this method, memory bandwidth increase can be minimized and this GUI could be shown while performing movie playback.

Full Screen Menu With HD Display

Figure 3 shows an example of a GUI that covers a large part of the screen. This kind of menu could also be implemented without increasing memory bandwidth by carefully assigning the bitmap to the OSD windows without using the attribute window.

Figure 3 Full Screen Menu Example

Figure 3 Full Screen Menu Example

As shown in Figure 4, OSD 0 can contain the menu part with 25% transparency and OSD1 can contain the banner part with 40%transparency. The sizes of the OSD 0 and OSD 1 windows should be minimized to cover only the necessary parts; this is the key to reduce memory bandwidth.

Figure 4 OSD Window Assignment Example

Figure 4 OSD Window Assignment Example

Functionality Supported

Configuration Feature List DM355-270 + 8 bank DDR2 DM355-216 + 512 MBit 4 bank DDR2 DM355-135 + 512 MBit 4 bank DDR2
Display on LCD/TV VGA movie MPEG4 encode/ decode 30FPS+ display on LCD/TV Y Y Y
720P HD movie MPEG4 encode/ decode 30FPS + display on LCD/TV Y Y N
VGA movie MPEG4 encode 30FPS+ display on LCD/TV + Video Stabilization Y Y Y
720P HD movie MPEG4 encode 30FPS+ display on LCD/TV + Video Stabilization Y Y N
VGA movie MPEG4 encode 30FPS+ display on LCD/TV + 5x digital zoom Y Y N
720P HD movie MPEG4 encode 30FPS+ display on LCD/TV + 3x digital zoom Y1 N N
VGA movie MPEG4 encode 30FPS+ display on LCD/TV + 5x digital zoom + Video Stabilization Y Y N
720P HD movie MPEG4 encode 30FPS+ display on LCD/TV + 3x digital zoom + Video Stabilization Y1 N N
Display on HDTV VGA movie MPEG4 decode 30FPS +Display on HDTV (Y Pb Pr) Y2 N N
720P HD movie MPEG4 decode 30FPS +Display on HDTV (Y Pb Pr) Y N N
VGA movie MPEG4 encode 30FPS +Display on HDTV (Y Pb Pr) N3 N3 N3
VGA movie MPEG4 encode 30FPS +Display on HDTV (Y Pb Pr) +Video Stabilization N3 N3 N3
720P HD movie MPEG4 encode 30FPS +Display on HDTV (Y Pb Pr) N3 N3 N3

 

1) “720P HD movie MPEG4 encode 30FPS+ display on LCD/TV + 5x digital zoom + Video Stabilization” 15fps possible with DM355-270

2) Only display of VGA size possible in the center of HDTV. Display of 720P upsampled frame not possible

3) HD Display not possible with Movie Encode

davinci(TI DSP), IT技术 ,

PHP中的mb_convert_encoding与iconv函数介绍

2009年8月15日
PHP中的mb_convert_encoding与iconv函数介绍已关闭评论

mb_convert_encoding这个函数是用来转换编码的。原来一直对程序编码这一概念不理解,不过现在好像有点开窍了。

不过英文一般不会存在编码问题,只有中文数据才会有这个问题。比如你用Zend Studio或Editplus写程序时,用的是gbk编码,如果数据需要入数据库,而数据库的编码为utf8时,这时就要把数据进行编码转换,不然进到数据库就会变成乱码。

mb_convert_encoding的用法见官方:

http://cn.php.net/manual/zh/function.mb-convert-encoding.php

做一个GBK To UTF-8

< ?php

header("content-Type: text/html; charset=Utf-8");

echo mb_convert_encoding("妳係我的友仔", "UTF-8", "GBK");

?>

再来个GB2312 To Big5

< ?php

header("content-Type: text/html; charset=big5");

echo mb_convert_encoding("你是我的朋友", "big5", "GB2312");

?>

不过要使用上面的函数需要安装但是需要先enable mbstring 扩展库。

PHP中的另外一个函数iconv也是用来转换字符串编码的,与上函数功能相似。

下面还有一些详细的例子:

iconv — Convert string to requested character encoding

(PHP 4 >= 4.0.5, PHP 5)

mb_convert_encoding — Convert character encoding

(PHP 4 >= 4.0.6, PHP 5)

用法:

string mb_convert_encoding ( string str, string to_encoding [, mixed from_encoding] )

需要先enable mbstring 扩展库,在 php.ini里将; extension=php_mbstring.dll 前面的 ; 去掉

mb_convert_encoding 可以指定多种输入编码,它会根据内容自动识别,但是执行效率比iconv差太多;

string iconv ( string in_charset, string out_charset, string str )

注意:第二个参数,除了可以指定要转化到的编码以外,还可以增加两个后缀://TRANSLIT 和 //IGNORE,其中 //TRANSLIT 会自动将不能直接转化的字符变成一个或多个近似的字符,//IGNORE 会忽略掉不能转化的字符,而默认效果是从第一个非法字符截断。

Returns the converted string or FALSE on failure.

使用:

发现iconv在转换字符”—”到gb2312时会出错,如果没有ignore参数,所有该字符后面的字符串都无法被保存。不管怎么样,这个”—”都无法转换成功,无法输出。 另外mb_convert_encoding没有这个bug.

一般情况下用 iconv,只有当遇到无法确定原编码是何种编码,或者iconv转化后无法正常显示时才用mb_convert_encoding 函数.

from_encoding is specified by character code name before conversion. it can be array or string – comma separated enumerated list. If it is not specified, the internal encoding will be used.

/* Auto detect encoding from JIS, eucjp-win, sjis-win, then convert str to UCS-2LE */

$str = mb_convert_encoding($str, “UCS-2LE”, “JIS, eucjp-win, sjis-win”);

/* “auto” is expanded to “ASCII,JIS,UTF-8,EUC-JP,SJIS” */

$str = mb_convert_encoding($str, “EUC-JP”, “auto”);

例子:

$content = iconv(”GBK”, “UTF-8″, $content);

$content = mb_convert_encoding($content, “UTF-8″, “GBK”);

IT技术, php , , ,

解决wordpress中文tags显示错误

2009年8月15日
解决wordpress中文tags显示错误已关闭评论

 

解决wordpress中文tags显示错误

好不容易修改了permalink,在检查的时候却发现Tags出现了问题,字母的可以访问,google了一下发现WordPress的中文支持有问题,特别是在使用Permalink的时候。我也想原创文章,可是在这种时候,只能是留个记号,以便以后查询 了。
本文将分析其中的原因和网上流传的多种解决方案,并给出一个具体的解决结论。
这个问题主要表现为,在默认情况下,Wordpress对于形如这样的链接(链接1):

www.example.com/tag/中文

不能正常访问,会产生404或500错误,或者其他的错误。
而对于这样的链接(链接2):

www.example.com/?tag=中文

WordPress就能够正确解析。
原因:这是URL编码问题造成的。对于上面的链接1,这是一个PathInfo,对于链接2,这是一个QueryString。事实证明,对于UTF-8 的页面,IE和FF都会正确发送PathInfo和QueryString(而不像有些文章中说的,他们在不同的设置下会有错误的反应),但服务器 端,IIS会将PathInfo转换成GBK编码从而造成错误,于是Windows下的此类问题只需要转回来就行了;但是Linux下,Apache不支 持中文PathInfo,要么对Apache进行改造,要么只能像我一样,Linux主机无法使用中文permalink。于是,我们只能寻找绕路的方 法。

解决方案分析:
一、转换编码
原理是,IIS会将PathInfo中的UTF-8转换成GBK,而QueryString中就不会转换,故而为了使用Permalink,采用以下方法:
打开wp-includes/classes.php文件,

if ( isset($_SERVER['PATH_INFO']) )
  $pathinfo = $_SERVER['PATH_INFO'];
else
  $pathinfo = '';
$pathinfo_array = explode('?', $pathinfo);
$pathinfo = str_replace("%", "%25", $pathinfo_array[0]);
$req_uri = $_SERVER['REQUEST_URI'];

改为

if ( isset($_SERVER['PATH_INFO']) )
  $pathinfo = mb_convert_encoding($_SERVER['PATH_INFO'], "UTF-8", "GBK");
else
  $pathinfo = '';
$pathinfo_array = explode('?', $pathinfo);
$pathinfo = str_replace("%", "%25", $pathinfo_array[0]);
$req_uri = mb_convert_encoding($_SERVER['REQUEST_URI'], "UTF-8", "GBK");

局限:只对Windows主机、且必须是Windows下的IIS主机有效。

mb_convert_encoding的使用需打开 php_mbstring.dll,相关说明详见

PHP的内码转换函数 mb_convert_encoding()

 

二、修改wp-includes/rewrite.php
这是网上最常见的方法,原理是,让WordPress在对其他内容使用Permalink的时候,对tag不使用,而使用链接2的QueryString模式发送中文编码:

 function get_tag_permastruct() {
if (isset($this->tag_structure)) {
return $this->tag_structure;
}
if (empty($this->permalink_structure)) { //-----this line need change------
$this->tag_structure = '';
return false;
}

把第5行改为

if (!empty($this->permalink_structure)) {

局限:没有起到Permalink的“漂亮”作用,如果不能自己修改WP的文件就没办法了。

三、修改tag base
原理同上,只要让WordPress在打开了Permalink功能后继续对tag不理不问就行了。那么,欺骗WordPress,让它用链接2的格式来显示Permalink,可行么?可行,因为WordPress可以自定义Permalink的形式:
在WordPress的 Settings – Permalinks – Tag base 中填上
/?tag=
注意””不能少,引用原文中的写法不对。另外要注意每次输入””,WP都会再次转义为”\”,所以每次点提交都会把””翻一倍,点两次就是”\\”,所以不要多点,一次就对了。
这个方法的结果是使得链接变成这个样子

www.example.com/?tag=/中文/

多出来的斜杠对于服务器丝毫没有影响,还是被视为QueryString,效果同上。
局限是链接变得更加不好看了,更为致命的是插件生成的Sitemap中,tag链接会变成错误的形式,如果你很在乎Sitemap,请不要使用这个方法,除非你真的无法修改自己的rewrite.php文件。

但是当你使用WP-SuperCache或者类似的缓存插件时,它会加入自己的rewrite规则,所有请求先由自己判断,不在缓存中或者不符合缓 存规则才交由WordPress处理。但问题在于,它不支持中文URL的解析,哪怕是QueryString也不行。于是我们必须绕过它。
这是WP-SuperCache在.htaccess文件里所添加的rewrite规则

RewriteEngine On
RewriteBase /
 
RewriteCond %{REQUEST_METHOD} !=POST
RewriteCond %{QUERY_STRING} !.*s=.*
RewriteCond %{QUERY_STRING} !.*p=.*
RewriteCond %{QUERY_STRING} !.*attachment_id=.*
RewriteCond %{QUERY_STRING} !.*wp-subscription-manager=.*
RewriteCond %{HTTP_COOKIE} !^.*(comment_author_|wordpress|wp-postpass_).*$
RewriteCond %{HTTP:Accept-Encoding} gzip
RewriteCond %{DOCUMENT_ROOT}/wp-content/cache/supercache/%{HTTP_HOST}/$1/index.html.gz -f
RewriteRule ^(.*) /wp-content/cache/supercache/%{HTTP_HOST}/$1/index.html.gz [L]
 
RewriteCond %{REQUEST_METHOD} !=POST
RewriteCond %{QUERY_STRING} !.*s=.*
RewriteCond %{QUERY_STRING} !.*p=.*
RewriteCond %{QUERY_STRING} !.*wp-subscription-manager=.*
RewriteCond %{QUERY_STRING} !.*attachment_id=.*
RewriteCond %{HTTP_COOKIE} !^.*(comment_author_|wordpress|wp-postpass_).*$
RewriteCond %{DOCUMENT_ROOT}/wp-content/cache/supercache/%{HTTP_HOST}/$1/index.html -f
RewriteRule ^(.*) /wp-content/cache/supercache/%{HTTP_HOST}/$1/index.html [L]

我们要做的就是不让它去判断中文tag链接,在两个 RewriteCond %{REQUEST_METHOD} !=POST 后面分别加入这样一句:

RewriteCond %{QUERY_STRING} !.*tag=.*

含义是如果QueryString中含有tag字样,请不要解析(交给下一条规则,一般来说就是WordPress的index.php了)。

结论:
Windows+IIS主机下,通过方案一可以完美解决中文tag问题
Linux+Apache主机下,不能使用中文Permalink,除非修改Apache,否则只有用方案二和方案三绕行。
方案二是较为推荐的方法,但是搭配WP-SuperCache使用的时候,需要自己在.htaccess文件中加入一条不处理tag链接的规则。

IT技术, 互联网技术 , , ,

php中如何使用explode()

2009年8月15日
php中如何使用explode()已关闭评论

 

explode

(PHP 3, PHP 4, PHP 5)

explode — 使用一个字符串分割另一个字符串

描述

array explode ( string separator, string string [, int limit] )

此函数返回由字符串组成的数组,每个元素都是 string 的一个子串,它们被字符串 separator 作为边界点分割出来。如果设置了 limit 参数,则返回的数组包含最多 limit 个元素,而最后那个元素将包含 string 的剩余部分。

如果 separator 为空字符串(""),explode() 将返回 FALSE。如果 separator 所包含的值在 string 中找不到,那么 explode() 将返回包含 string 单个元素的数组。

如果 limit 参数是负数,则返回除了最后的 limit 个元素外的所有元素。此特性是 PHP 5.1.0 中新增的。

由于历史原因,虽然 implode() 可以接收两种参数顺序,但是 explode() 不行。你必须保证 separator 参数在 string 参数之前才行。

注: 参数 limit 是在 PHP 4.0.1 中加入的。

例子 1. explode() 示例

<?php
// 示例 1
$pizza  = "piece1 piece2 piece3 piece4 piece5 piece6";
$pieces = explode(" ", $pizza);
echo
$pieces[0]; // piece1
echo $pieces[1]; // piece2

// 示例 2
$data = "foo:*:1023:1000::/home/foo:/bin/sh";
list(
$user, $pass, $uid, $gid, $gecos, $home, $shell) = explode(":", $data);
echo
$user; // foo
echo $pass; // *

?>

例子 2. limit 参数示例

<?php
$str
= 'one|two|three|four';

// 正数的 limit
print_r(explode('|', $str, 2));

// 负数的 limit
print_r(explode('|', $str, -1));
?>

以上示例将输出:

Array
(
    [0] => one
    [1] => two|three|four
)
Array
(
    [0] => one
    [1] => two
    [2] => three
)

注: 该函数可安全用于二进制对象。

 

php ,

php如何使用implode()

2009年8月15日
php如何使用implode()已关闭评论

 

定义和用法

implode() 函数把数组元素组合为一个字符串。

语法

implode(separator,array)
参数 描述
separator 可选。规定数组元素之间放置的内容。默认是 ""(空字符串)。
array 必需。要结合为字符串的数组。

说明

虽然 separator 参数是可选的。但是为了向后兼容,推荐您使用使用两个参数。

提示和注释

注释:implode() 可以接收两种参数顺序。但是由于历史原因,explode() 是不行的。你必须保证 separator 参数在 string 参数之前才行。

例子

<?php
$arr = array('How','to','use','implode()');
echo implode(" ",$arr);
?>

输出:

How to use implode()

IT技术, php ,

C2000系CMD文件的配置理解

2009年8月11日
C2000系CMD文件的配置理解已关闭评论

查了关于cmd的编写说明 ,这个算比较好的,所以转载,虽然这个是讲C2000的,而我想要的是C6000/davinci。ccs很强大啊!

CMD 的专业名称叫链接器配置文件,是存放链接器的配置信息的,我们简称为命令文件,其中比较关键的就是MEMORY和SECTIONS两个伪指令的使用,常常令人困惑,系统出现的问题也经常与它们的不当使用有关。CCS是DSP软件对DOS系统继承的开发环境,CCS的命令文件经过DOS命令文件长时间的引申发展,已经变得非常简洁(不知道TI文档有没有详细CMD配置说明)。我学CMD是从DOS里的东西开始的,所以也从DOS环境下的CMD说起:

1命令文件的组成
命令文件的开头部分是要链接的各个子目标文件的名字,这样链接器就可以根据子目标文件名,将相应的目标文件链接成一个文件;接下来就是链接器的操作指令,这些指令用来配置链接器,接下来就是MEMORY和SECTIONS两个伪指令的相关语句,必须大写。MEMORY,用来配置目标存储器,SECTIONS用来指定段的存放位置。结合下面的典型DOS环境的命令文件link.cmd来做一下说明:
file.obj            //子目标文件名1
file2.obj        //子目标文件名2
file3.obj        //子目标文件名3
– o prog.out  //连接器操作指令,用来指定输出文件
– m prog.m    //用来指定MAP文件
MEMORY
{ 略 }
SECTIONS
{ 略 }
otherlink.cmd
本命令文件link.cmd要调用的otherlink.cmd等其他命令文件,则文件的名字要放到本命令文件最后一行,因为放开头的话,链接器是不会从被调用的其他命令文件中返回到本命令文件。

2 MEMORY伪指令
MEMORY用来建立目标存储器的模型,SECTIONS指令就可以根据这个模型来安排各个段的位置,MEMORY指令可以定义目标系统的各种类型的存储器及容量。MEMORY的语法如下:
MEMORY
{
PAGE 0 : name1[(attr)] : origin = constant,length = constant
         name1n[(attr)] : origin = constant,length = constant
PAGE 1 : name2[(attr)] : origin = constant,length = constant
         name2n[(attr)] : origin = constant,length = constant
PAGE n : namen[(attr)] : origin = constant,length = constant
         namenn[(attr)] : origin = constant,length = constant
}
PAGE关键词对独立的存储空间进行标记,页号n的最大值为255,实际应用中一般分为两页,PAGE0程序存储器和PAGE1数据存储器。
name存储区间的名字,不超过8个字符,不同的PAGE上可以出现相同的名字(最好不用,免的搞混),一个PAGE内不许有相同的name。
attr的属性标识,为R表示可读;W可写X表示区间可以装入可执行代码;I表示存储器可以进行初始话,什么属性代码也不写,表示存储区间具有上述的四种属性,基本上我们都选择这种写法。
origin:略。
length:略。
下面是经常用的2407的简单写法大家参考,程序从0x060开始,要避开加密位,不从0x0044开始更可靠一点,此例中的同名的页可以只写第一个,其后省略,但写上至少安全一点:
MEMORY
{
PAGE 0: VECS: origin = 0x0000,  length 0x40
PAGE 0: PROG: origin = 0x0060,  length 0x6000
PAGE 1: B0  : origin = 0x200,  length 0x100
PAGE 1: B1  : origin = 0x300,  length 0x100
PAGE 1: DATA: origin = 0x0860,  length 0x0780
}

3 SECTIONS伪指令
SECTIONS指令的语法如下:
SECTIONS
{
.text:  {所有.text输入段名}  load=加载地址  run =运行地址
.data:  {所有.data输入段名}  load=加载地址  run =运行地址
.bss:  {所有.bss输入段名}    load=加载地址  run =运行地址
.other: {所有.other输入段名}  load=加载地址  run =运行地址
}
SECTIONS必须用大写字母,其后的大括号里是输出段的说明性语句,每一个输出段的说明都是从段名开始,段名之后是如何对输入段进行组织和给段分配存储器的参数说明:
以.text段的属性语句为例,“{所有.text输入段名}”这段内容用来说明连接器输出段的.text段由哪些子目标文件的段组成,举例如下
SECTIONS
{
.text:{  file1.obj(.text) file2(.text) file3(.text,cinit)}略
}
指明输出段.text要链接file1.obj的.text和 file2的.text 还有file3的.text和.cinit。在CCS的SECTIONS里通常只写一个中间没有内容的“{ }”就表示所有的目标文件的相应段
接下来说明“load=加载地址  run =运行地址”链接器为每个输出段都在目标存储器里分配两个地址:一个是加载地址,一个是运行地址。通常情况下两个地址是相同的,可以认为输出段只有一个地址,这时就可以不加“run =运行地址”这条语句了;但有时需要将两个地址分开,比如将程序加载到FLASH,然后放到RAM中高速运行,这就用到了运行地址和加载地址的分别配置了,如下例所示:
.const :{略} load = PROG  run = 0x0800
常量加载在程序存储区,配置为在RAM里调用。
“load=加载地址”的几种写法需要说明一下,首先“load”关键字可以省略,“=”可以写成“>”, “加载地址”可以是:地址值、存储区间的名字、PAGE关键词等,所以大家见到“.text:{ } > 0x0080”这样的语句可千万不要奇怪。“run =运行地址”中的“ = ”可以用“>”,其它的简化写法就没有了。大家不要乱用。

4 CCS中的案例
在CCS中的命令文件好像简化了不少,少了很多东西,语句也精简了好多,首先不用指定输入链接器的目标文件,CCS会自动默认处理,其次链接器的配置命令也和DOS的环境不同,需要了解的请找TI文档吧!下面是刘和平书中的例子,大家来看看是不是可以很精确的理解了呢!
-stack 40
/*————————————————————————-*/
/*  命令文件 – 存储空间 F2407            */
/*————————————————————————-*/
MEMORY
{
PAGE 0 :  VECS : origin =    0h , length = 40h  /*  程序复位 */
      PVECS : origin =  40h , length = 70h  /* 外围模块中断向量 */
      PROG : origin =  0b0h , length = 7F50h  /* 在片FLASH */
PAGE 1 :  MMRS : origin =    0h , length =  05Fh  /* MMRS            */
    B2 : origin = 0060h , length =  020h  /* DARAM B2 块  */
    B0 : origin = 0200h , length =  100h  /* DARAM B0 块  */
    B1 : origin = 0300h , length =  100h  /* DARAM B1 块  */
SARAM  : origin = 0800h , length =  0800h    /* SARAM 块  */
EXT : origin = 8000h , length =  8000h  /* 外部存储器  */
}
/*————————————————————————-*/
/* SECTIONS ALLOCATION                                                    */
/*————————————————————————-*/
SECTIONS
{
    .reset  : { } > VECS  PAGE 0  /* 复位中断向量表 */
    .vectors : { } > VECS  PAGE 0 /* 中断向量表 */
    .pvecs  : { } > PVECS  PAGE 0 /* 外围模块中断向量表  */
    .text    : { } > PROG  PAGE 0 /* 代码 */
    .cinit  : { } > PROG  PAGE 0  
    .bss    : { } > SARAM  PAGE 1 /* 块 B2 */
    .const  : { } > SARAM  PAGE 1 /* 块 B2 */  
    .stack  : { } > B1    PAGE 1 /* 堆栈—40个单元 */
}

http://blog.21ic.com/user1/1472/archives/2007/38482.html

davinci(TI DSP), IT技术 ,

How to update CCS ARM cgtools to build the DM365 ubl in CCS 3.3

2009年8月10日
How to update CCS ARM cgtools to build the DM365 ubl in CCS 3.3已关闭评论

The DM365 CCS ubl is in the flash_utils.tar.gz which you can find after you install psp_02_10_xx_xx.bin. 1. Update the CCS ARM cgtools to V4.5.0. You can download it here. Then install it. 2. Change the ARM cgtools used in CCS. a. There are two ways to open Component Manager.

  • In CCS, pls select Help->About…, then a new window appears. Pls click Component Manager. Then you will see the Code Composer Studio Component Manager window.
  • Or you can go to /CCS install folder/cc/bin. Pls run comp_mgr.exe. Then you will also see the Component Manager window.

b. Pls click ‘+’ of Build Tools, then ‘+’ of TMS470R2x, then you will see all CCS ARM cgtools you installed on the PC. Select the version you need, such as V4.5.0. (TMS470R1x is for ARM7 and TMS470R2x is for ARM9.) c. Close the Code Composer Studio Component Manager window. You will see a warning window "This configuration change requires Code Composer Studio to be restarted.. Pls save your work and restart Code Composer Studio before proceeding.". Read it and click ok. d. The Component Manager will ask "Do you want to save changes?". Pls select Yes. 3. Restart the CCS to let the new setting effect. Then build the ubl project with new ARM cgtools. from: http://wiki.davincidsp.com/index.php/How_to_update_CCS_ARM_cgtools_to_build_the_DM365_ubl_in_CCS_3.3

davinci(TI DSP), IT技术 , ,

WordPress在IIS ISAPI ReWrite下的URL规则

2009年8月9日
WordPress在IIS ISAPI ReWrite下的URL规则已关闭评论

WordPress在IIS ISAPI ReWrite下的URL规则

为了便于搜索引擎抓取,俺们可以将wordpress进行静态URL重写、下面是URL ReWrite的规则!

下面是Rewrite规则:(请将下面代码内容存到httpd.ini,然后选择一种”红色部份”的内容填写到wordpress后台自定链接的”永远链接”)

[ISAPI_Rewrite]

# 3600 = 1 hour
CacheClockRate 3600

RepeatLimit 32

# Protect httpd.ini and httpd.parse.errors files
# from accessing through HTTP
# # /%year%%monthnum%%day%/%postname%/

RewriteRule /tag/(.*) /index\.php\?tag=$1

RewriteRule /(about|copyright|leebolin)/ /index\.php\?pagename=$1

RewriteRule /category/(.*)/(feed|rdf|rss|rss2|atom)/?$ /wp-feed\.php\?category_name=$1&feed=$2

RewriteRule /category/?(.*)/ /index\.php\?category_name=$1

RewriteRule /author/(.*)/(feed|rdf|rss|rss2|atom)/?$ /wp-feed\.php\?author_name=$1&feed=$2

RewriteRule /author/?(.*) /index\.php\?author_name=$1

RewriteRule /feed/?$ /wp-feed\.php/\?feed=rss2

RewriteRule /comments/feed/?$ /wp-feed\.php/\?feed=comments-rss2

RewriteRule /page/(.*)/ /index\.php\?paged=$1

RewriteRule /([0-9]{4})([0-9]{1,2})([0-9]{1,2})/([^/]+)/?([0-9]+)?/?$ /index\.php\?year=$1&monthnum=$2&day=$3&name=$4&page=$5

RewriteRule /([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/?$ /index\.php\?year=$1&monthnum=$2&day=$3&page=$4

RewriteRule /([0-9]{4})/([0-9]{1,2})/?$ /index\.php\?year=$1&monthnum=$2&page=$3

RewriteRule /([0-9]{4})([0-9]{1,2})([0-9]{1,2})/([^/]+)/(feed|rdf|rss|rss2|atom)/?$ /index\.php\?year=$1&monthnum=$2&day=$3&name=$4&feed=$5

RewriteRule /([0-9]{4})([0-9]{1,2})([0-9]{1,2})/([^/]+)/trackback/?$ /wp-trackback\.php\?year=$1&monthnum=$2&day=$3&name=$4&tb=1

# # WordPress rewrite rules#
# /Html/%post_id%.html

RewriteRule /tag/(.*) /index\.php\?tag=$1

RewriteRule /(about|copyright|leebolin|favor|archives)/ /index\.php\?

pagename=$1

RewriteRule /Html/category/(.*)/(feed|rdf|rss|rss2|atom)/?$ /wp-feed\.php\?

category_name=$1&feed=$2

RewriteRule /Html/category/?(.*)/ /index\.php\?category_name=$1

RewriteRule /author/(.*)/(feed|rdf|rss|rss2|atom)/?$ /wp-feed\.php\?

author_name=$1&feed=$2

RewriteRule /author/?(.*) /index\.php\?author_name=$1

RewriteRule /rss.xml /wp-feed\.php/\?feed=rss2

RewriteRule /feed/?$ /wp-feed\.php/\?feed=rss2

RewriteRule /comments/feed/?$ /wp-feed\.php/\?feed=comments-rss2

RewriteRule /([0-9]+)/?([0-9]+)?/?$ /index\.php\?p=$1&page=$2

# RewriteRule /Html/([0-9]+)/?([0-9]+)?/?$ /index\.php\?p=$1&page=$2

RewriteRule /Html/([0-9]+).html /index\.php\?p=$1

RewriteRule /page/(.*)/ /index\.php\?paged=$1

RewriteRule /Html/date/([0-9]{4})([0-9]{1,2})([0-9]{1,2})/([^/]+)/?([0-9]+)?/?$

/index\.php\?year=$1&monthnum=$2&day=$3&name=$4&page=$5

RewriteRule /Html/date/([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/?$ /index\.php\?

year=$1&monthnum=$2&day=$3&page=$4

RewriteRule /Html/date/([0-9]{4})/([0-9]{1,2})/?$ /index\.php\?

year=$1&monthnum=$2&page=$3

RewriteRule /Html/([0-9]+).html/(feed|rdf|rss|rss2|atom)/ /index\.php\?

feed=rss2&p=$1

RewriteRule /Html/([0-9]+).html/trackback/ /wp-trackback\.php\?p=$1

RewriteRule /photo/?([^/]*)?/?([^/]*)?/?([^/]*)?/?([^/]*)?/?$ /wp-

content/plugins/fgallery/fim_photos\.php\?$1=$2&$3=$4 [QSA,L,I]

RewriteRule /photo/?(.*) /wp-content/plugins/fgallery/fim_photos\.php\?

$1=$2&$3=$4 [QSA,L,I]

RewriteRule ^(.*)/archiver/([a-z0-9\-]+\.html)$ $1/archiver/index\.php\?$2
RewriteRule ^(.*)/forum-([0-9]+)-([0-9]+)\.html$ $1/forumdisplay\.php\?

fid=$2&page=$3
RewriteRule ^(.*)/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ $1/viewthread\.php\?

tid=$2&extra=page\%3D$4&page=$3
RewriteRule ^(.*)/profile-(username|uid)-(.+)\.html$ $1/viewpro\.php\?$2=$3
RewriteCond Host: (.+)
RewriteCond Referer: (?!http://\1.*).*
RewriteRule .*\.(?:gif|jpg|png) /block.gif

RewriteRule ^(.*)/archiver/([a-z0-9\-]+\.html)$ $1/archiver/index\.php\?$2
RewriteRule ^(.*)/forum-([0-9]+)-([0-9]+)\.html$ $1/forumdisplay\.php\?fid=$2&page=$3
RewriteRule ^(.*)/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ $1/viewthread\.php\?tid=$2&extra=page\%3D$4&page=$3
RewriteRule ^(.*)/profile-(username|uid)-(.+)\.html$ $1/viewpro\.php\?$2=$3
RewriteCond Host: (.+)
RewriteCond Referer: (?!http://\1.*).*
RewriteRule .*\.(?:gif|jpg|png) /block.gif

IT技术, 互联网技术 ,

WordPress中最好的永久链接结构

2009年8月9日
WordPress中最好的永久链接结构已关闭评论

WordPress中最好的永久链接结构

wordpress中默认的永久链接结构就像是这个样子:http://blogname.com/?p=123,123就代表日志的内部ID,这种结构对于SEO来说是极不有好的,既不利于网站PR也影响你在搜索引擎中的排名。至少你的永久链接中都应该含有日志的关键词。真搞不懂为什么wordpress会拿这样的连接形式作为默认链接~

一个漂亮的链接形式应该像这个样子:http://blogname.com/2008/11/05/some-post-name。现在问题就在于哪种永久链接形式是最好的。一点可以肯定日志名必须包含在结构中。下面是wordpress中常用的几种形式:

日期和名称:链接结构为“年、月、日和日志名称”,这种结构能够帮助读者了解文章发表的详细时间,也可以让作者方便查找日志。

月份和名称:和第一种结构类似,只是少了年份和具体日期显示。

分类和名称:就象这样 http://blogname.com/some-category/some-post-name,这种结构有许多博客采用,据说分类名与日志名相关有利于SEO。

日志名称:例如这样 blogname.com/some-post-name,这种方式也有很大一部分博客使用。

WordPress中还提供了一些代码,让你自定义永久链接的结构,下面是可以使用的代码:

%year% – 显示年份,四位数,如 2008

%monthnum% – 显示月份,如 05

%day% – 显示月份中的日期,如 28

%hour% – 显示小时数,如 15

%minute% – 显示分钟数,如 43

%second% – 显示秒数,如 33

%postname% – 显示日志名称,例如“This Is A Great Post!”转换为this-is-a-great-post,中文名将变成怪怪的符号…

%post_id% – 显示日志独一无二的ID,如 213

%category% – 显示分类名称

%author% – 显示作者名称

你可以使用”-“ 或者 ”/“把这些代码连接起来,例如:/%category%/%postname%-%post_id%/

对于我个人来说,我更倾向于仅显示日志名称和日志ID的结构,为什么?因为你的日志名称会包含有关键字,因此,如果URL很短的话,那些关键词的密 度将非常之高(这一概念称之为关键词相对权重),我并不鼓励仅仅使用日志名称的永久链接(尽管现在我是这样做的),因为这样可能在你重新定义规则时,出现 访问不到网页的情况。另外也有可能出现两篇文章URL相同的情况,尽管你自己没意识到~

另外如果你要重新定义你的永久链接结构,可以使用插件permalinks migration,帮助你方便地重新定向永久链接。

IT技术, 互联网技术 , ,

C#中UrlEncode的实现

2009年8月8日
public static string UrlEncode(string str)
{
StringBuilder sb
= new StringBuilder();
byte[] byStr = System.Text.Encoding.Default.GetBytes(str);
for(int i = 0; i < byStr.Length; i++)
{
sb.Append(
@”% + Convert.ToString(byStr[i],16));
}


return (sb.ToString());

}

C#的一段返回UrlEncode加密格式的代码~
UrlEncode加密就是在网址中汉字的转码,就是我们常看到的%xx%xx那样的东东


IT技术

DateTime.ToString()的模式使用

2009年8月7日
DateTime.ToString()的模式使用已关闭评论

DateTime.ToString()所有的模式:

0 MM/dd/yyyy 08/22/2006
1 dddd, dd MMMM yyyy Tuesday, 22 August 2006
2 dddd, dd MMMM yyyy HH:mm Tuesday, 22 August 2006 06:30
3 dddd, dd MMMM yyyy hh:mm tt Tuesday, 22 August 2006 06:30 AM
4 dddd, dd MMMM yyyy H:mm Tuesday, 22 August 2006 6:30
5 dddd, dd MMMM yyyy h:mm tt Tuesday, 22 August 2006 6:30 AM
6 dddd, dd MMMM yyyy HH:mm:ss Tuesday, 22 August 2006 06:30:07
7 MM/dd/yyyy HH:mm 08/22/2006 06:30
8 MM/dd/yyyy hh:mm tt 08/22/2006 06:30 AM
9 MM/dd/yyyy H:mm 08/22/2006 6:30
10 MM/dd/yyyy h:mm tt 08/22/2006 6:30 AM
10 MM/dd/yyyy h:mm tt 08/22/2006 6:30 AM
10 MM/dd/yyyy h:mm tt 08/22/2006 6:30 AM
11 MM/dd/yyyy HH:mm:ss 08/22/2006 06:30:07
12 MMMM dd August 22
13 MMMM dd August 22
14 yyyy’-‘MM’-‘dd’T’HH’:’mm’:’ss.fffffffK 2006-08-22T06:30:07.7199222-04:00
15 yyyy’-‘MM’-‘dd’T’HH’:’mm’:’ss.fffffffK 2006-08-22T06:30:07.7199222-04:00
16 ddd, dd MMM yyyy HH’:’mm’:’ss ‘GMT’ Tue, 22 Aug 2006 06:30:07 GMT
17 ddd, dd MMM yyyy HH’:’mm’:’ss ‘GMT’ Tue, 22 Aug 2006 06:30:07 GMT
18 yyyy’-‘MM’-‘dd’T’HH’:’mm’:’ss 2006-08-22T06:30:07
19 HH:mm 06:30
20 hh:mm tt 06:30 AM
21 H:mm 6:30
22 h:mm tt 6:30 AM
23 HH:mm:ss 06:30:07
24 yyyy’-‘MM’-‘dd HH’:’mm’:’ss’Z’ 2006-08-22 06:30:07Z
25 dddd, dd MMMM yyyy HH:mm:ss Tuesday, 22 August 2006 06:30:07
26 yyyy MMMM 2006 August
27 yyyy MMMM 2006 August

DateTime.ToString ( ‘d’ ) :

0 MM/dd/yyyy 08/22/2006

DateTime.ToString ( ‘D’ ) :

0 dddd, dd MMMM yyyy Tuesday, 22 August 2006

DateTime.ToString ( ‘f’ ) :

0 dddd, dd MMMM yyyy HH:mm Tuesday, 22 August 2006 06:30
1 dddd, dd MMMM yyyy hh:mm tt Tuesday, 22 August 2006 06:30 AM
2 dddd, dd MMMM yyyy H:mm Tuesday, 22 August 2006 6:30
3 dddd, dd MMMM yyyy h:mm tt Tuesday, 22 August 2006 6:30 AM

DateTime.ToString ( ‘F’ ) :

0 dddd, dd MMMM yyyy HH:mm:ss Tuesday, 22 August 2006 06:30:07

DateTime.ToString ( ‘g’ ) :

0 MM/dd/yyyy HH:mm 08/22/2006 06:30
1 MM/dd/yyyy hh:mm tt 08/22/2006 06:30 AM
2 MM/dd/yyyy H:mm 08/22/2006 6:30
3 MM/dd/yyyy h:mm tt 08/22/2006 6:30 AM

DateTime.ToString ( ‘G’ ) :

0 MM/dd/yyyy HH:mm:ss 08/22/2006 06:30:07

DateTime.ToString ( ‘m’ ) :

0 MMMM dd August 22

DateTime.ToString ( ‘r’ ) :

0 ddd, dd MMM yyyy HH’:’mm’:’ss ‘GMT’ Tue, 22 Aug 2006 06:30:07 GMT

DateTime.ToString ( ‘s’ ) :

0 yyyy’-‘MM’-‘dd’T’HH’:’mm’:’ss 2006-08-22T06:30:07

DateTime.ToString ( ‘u’ ) :

0 yyyy’-‘MM’-‘dd HH’:’mm’:’ss’Z’ 2006-08-22 06:30:07Z

DateTime.ToString ( ‘U’ ) :

0 dddd, dd MMMM yyyy HH:mm:ss Tuesday, 22 August 2006 06:30:07

DateTime.ToString ( ‘y’ ) :

0 yyyy MMMM 2006 August

自定义模式格式说明

d 日期
dd 日期,十位填充零
ddd 星期的缩写, 比如:Mon, Tues, Wed etc
dddd 星期几
h 12小时制
hh 12小时制, 十位填充零
H 24小时制
HH 24小时制,十位填充零
m
mm 分, 01
M 月份 1
MM 月份,01
MMM 月份名称缩写
MMMM 月份全名
s
ss 秒,十位填充零
t 上午下午的缩写
tt 上午,下午
y 年份: 1
yy 年份, 01
yyy 年 2001
yyyy 年 2001
K 时区 ( +05:00)
z 时区(e.g. +6)
zz 时区 (e.g. +06)
zzz 时区 (e.g. +06:00)
f 精确到十分之一秒
ff 精确到百分之一秒.
fff 千分之一秒.
ffff 万分之一秒
fffff 十万分之一秒
ffffff 百万分之一秒
fffffff 千万分之一秒
F 十分之一秒,为零时为空.
: 时间分隔符
/ 日期分隔符

C#, IT技术 ,

wordpress博客wp_list_categories标签用法详解

2009年8月5日
wordpress博客wp_list_categories标签用法详解已关闭评论

wp_list_categories 标签的用法。 作用: ·不是连接到某个分类的 ·排列分类 ·不显示上一次更新(上次更新后,在当前类内) ·可以无序排列 ·可以显示日志数量 ·可以只显示制定某个分类 ·可以指定分类说明or标题 ·可设置无Feed或Feed使用图标 ·没有任何exlude类,并包括所有类别? (’include’ => is not shown above) ·缩进?等级?排列样式 ·分类标题名单? ·没有限制的sql施加? (’number’ => 0 is not shown above) 不管这些了,先举几个例子你就明白了: 1.包含或排除某分类: 意思就是把分类ID为3,5,9,16的分类按名称顺序来排序:

1
<?php wp_list_categories('orderby=name&include=3,5,9,16'); ?>

复制代码 按名称排列,并显示每个分类的日志总数,并不显示ID为10的分类:

1
<?php wp_list_categories('orderby=name&show_count=1&exclude=10'); ?>

复制代码 2.显示或隐藏列表标题: 过滤ID为4和7的分类,并且列表标题设置为“哈哈”:

1
<?php wp_list_categories('exclude=4,7&title_li=哈哈'); ?>

复制代码 列表中只显示ID为5、9、23的分类,并把列表标题改为

;Poetry

(下面的格式是为了把“要显示的数据”和“标签参数区分开来”)

1
 <?php wp_list_categories('include=5,9,23&title_li=<h2>' . __('Poetry') . '</h2>' ); ?>

复制代码 3.那啥 这个参数的意思是:按ID排序,关闭分类说明(就是鼠标移动到连接上就不显示你在后台填的分类说明了,只显示“察看XX分类下的所有文章”),并且只显示ID为8的分类下的子分类,如果没有,则参数无效,会按默认来显示。

1
<?php wp_list_categories('orderby=id&show_count=1&use_desc_for_title=0&child_of=8'); ?>

复制代码 4.外观是分类后面显示个(RSS),作用就不用我说了吧?

1
<?php wp_list_categories('orderby=name&show_count=1&feed=RSS'); ?>

复制代码 5.这个比较酷,相信大家都喜欢: 分类名称后面显示一个自己制定的小图标,作用是RSS。

1
<?php wp_list_categories('orderby=name&show_count=1&feed_image=/images/rss.gif'); ?>

复制代码 6.花式列表: 改变当前正在浏览的分类名字的样式。’style=list’的作用是给输出的html代码 中加一个class=”current- cat”, 然后你在CSS里添一个.current-cat {color:red;}那么我浏览分类AAA时,列表中的“AAA”3个字就是红色的,浏览BBB,“BBB”就是红色的。

1
<?php wp_list_categories('style=list' ); ?>

复制代码 下面把所有参数和值汇总一下: show_option_all 值:任意填。 如果你写

1
<?php wp_list_categories('show_option_all=那啥'); ?>

,那么在列表第一个分类就显示“那啥”两字,不过连接是连接到blog首页的,正好可以利用此参数加个“首页”。 orderby 值:ID、name(默认值)、count。 作用是按这3个值来排序。 order 值:ASC(默认值)、DESC。 ASC为升序,DESC为降序。 show_last_updated 值:0(默认值)、1。 0无作用,1为最近更新的分类显示在前面。 style 值:list(默认值)、none。 例6中已经举例了。none无作用。 show_count 值:0、1(默认值) 1在每个分类后面显示日志数量,0不显示。 hide_empty 值:0、1(默认值) 1是隐藏没有发表日志的分类,0是显示所有。 use_desc_for_title 值:0、1(默认值) 0为关闭说明,1为显示说明。上面有例子。 child_of 值:数字 显示指定ID(也就是所填的这个数字)下的子分类。 feed 值:任意 假如你填“啊!”,那么在你每个分类后面都会出现“(啊!)”,连接地址是RSS地址。 feed_image 值:任意。虽然任意,但是是个图片的地址才对。 用来在分类后面显示个RSS Feed图标,上面有例子。 exclude 值:任意。但是要填分类名称或者分类ID才有效。 用来过滤(或者说隐藏)某个分类在列表中的出现。 include 值:任意。但是要填分类名称或者分类ID才有效。 作用是只显示所填的这个分类名或ID。 hierarchical 值:0、1(默认值) 说是按分类文章数目排列的,但测试无效果。 title_li 值:任意 用来改变列表标题的。 number 值:整数 设置一个显示上限。

IT技术, php ,

Zend Studio 5.2 注册码 5.5也可以用

2009年8月5日
Zend Studio 5.2 注册码 5.5也可以用已关闭评论

Username: Team FCN!
key:0359d06510103500

for Zend Studio 5.2 or 5.5

注意空格和感叹号

很强大的php开发工具

php ,