如何正确运用PHP filter判断过滤数据

2010年1月9日

在PHP出现至今,一直在不断的更新版本,增加新的功能,供我们大家使用,满足我们的需求。PHP 5.2以及更高的版本,PHP filter被绑定于系统,它可以对数据进行自动的过滤和判断。

第一种、PHP filter判断一个变量的内容是否符合要求

使用函数filter_var,第一个参数是要判断的变量。第二个参数是判断的要求,FILTER_VALIDATE_EMAIL表示判断是否符合email格式。如果变量是类似’boy@163.com’的数据,系统就会完整的输出‘boy@163.com’。如果是错误的格式,比如’boy’,就会输出false。如果没有填写表单中的email字段,系统输出空字符串。

$email = ‘boy@163.com’; echo filter_var($email, FILTER_VALIDATE_EMAIL);

第二种、PHP filter根据要求过滤一个变量的内容

和上面唯一的不同是第二个参数使用FILTER_SANITIZE_EMAIL,输出的结果会不同。如果变量是类似’boy@163.com’ 的数据,系统就会完整的输出’boy@163.com’。如果是错误的格式,比如’boy-afds3′,只要是数字和字母和划线等email格式中可以出现的内容,系统同样会完整的输出’boy-afds3′。如果变量没有设置内容,系统输出空字符串。如果是’boy阿三’,系统会把email格式中不允许的东西去除,输出’boy’。

$email = ‘boy@163.com’; echo filter_var($email, FILTER_SANITIZE_EMAIL);

第三种、PHP filter判断输入的变量的内容是否符合要求

使用函数filter_input。第一个参数表示从那里获得的数据,INPUT_POST表示通过POST方法传递过来,还可以使用 INPUT_GET, INPUT_COOKIE, INPUT_SERVER, INPUT_ENV,代表相应的途径。第二个参数就是数据的名称。第三个参数代表过滤的要求,FILTER_VALIDATE_EMAIL表示判断数据是否符合email格式。

假设通过表单的POST过来的一个字段email。如果是类似’boy@163.com’的数据,系统就会完整的输出’boy@163.com’。如果是错误的格式,比如’boy’,就会输出false。如果没有填写表单中的email字段,系统输出null,也就是空。

echo filter_input(INPUT_POST, ‘email’, FILTER_VALIDATE_EMAIL);

第四种、PHP filter根据要求过滤输入的变量的内容

和上面唯一的不同是第二个参数使用FILTER_SANITIZE_EMAIL,输出的结果会不同。假设通过表单的POST过来的一个字段email。

如果是类似’boy@163.com’的数据,系统就会完整的输出’boy@163.com’。如果是错误的格式,比如’boy-afds3′ ,只要是数字和字母和划线等email格式中可以出现的内容,系统同样会完整的输出’boy-afds3′。如果没有填写表单中的email字段,系统输出null,也就是空。如果是’boy阿三’,系统会把email格式中不允许的东西去除,输出’boy’。

echo filter_input(INPUT_POST, ‘email’, FILTER_SANITIZE_EMAIL);

以上就是PHP filter的具体功能介绍,希望对又需要的朋友有所帮助。

echohi PHP

SQLite数据库扫盲

2009年12月16日

★技术上的优点和特性
SQLite是一个轻量级、跨平台的关系型数据库。既然号称关系型数据库,支持SQL92标准中常用的玩意儿(比如视图、事务、触发器等)就是理所当然的了,咱今天就不细说了。今天主要聊聊一些有点特色的玩意儿。

◇轻量级
先说它的第一个特色:轻量级。想必SQLite的作者很看重这个特性,连它的Logo都是用的“羽毛”,来显摆它的轻飘飘。
SQLite和C/S模式的数据库软件不同,它是进程内的数据库引擎,因此不存在数据库的客户端和服务器。使用SQLite一般只需要带上它的一个动态库,就可以享受它的全部功能。而且那个动态库的尺寸也挺小,以版本3.6.11为例,Windows下487KB、Linux下347KB。

◇绿色软件
SQLite的另外一个特点是绿色:它的核心引擎本身不依赖第三方的软件,使用它也不需要“安装”。所以在部署的时候能够省去不少麻烦。

◇单一文件
所谓的“单一文件”,就是数据库中所有的信息(比如表、视图、触发器、等)都包含在一个文件内。这个文件可以copy到其它目录或其它机器上,也照用不误。

◇跨平台/可移植性
如果光支持主流操作系统,那就没啥好吹嘘的了。除了主流操作系统,SQLite还支持了很多冷门的操作系统。我个人比较感兴趣的是它对很多嵌入式系统(比如Android、Windows Mobile、Symbin、Palm、VxWorks等)的支持。

◇内存数据库(in-memory database)
这年头,内存越来越便宜,很多普通PC都开始以GB为单位来衡量内存(服务器就更甭提了)。这时候,SQLite的内存数据库特性就越发显得好用。
SQLite的API不区分当前操作的数据库是在内存还是在文件(对于存储介质是透明的)。所以如果你觉得磁盘I/O有可能成为瓶颈的话,可以考虑切换为内存方式。切换的时候,操作SQLite的代码基本不用大改,只要在开始时把文件Load到内存,结束时把内存的数据库Dump回文件就OK了。在这种情况下,前面提到的“online backup API”就派上用场了,聪明的同学应该明白我为啥这么期待backup功能了吧?

★技术上的缺点和不足
前面光聊了特性和优点,为了避免枪手写软文的嫌疑,再来说说SQLite的一些缺点。列位看官将来如果想用它,这些缺点要权衡一下。

◇并发访问的锁机制
SQLite在并发(包括多进程和多线程)读写方面的性能一直不太理想。数据库可能会被写操作独占,从而导致其它读写操作阻塞或出错。

◇SQL标准支持不全
在它的官方网站上,具体列举了不支持哪些SQL92标准。我个人感觉比较不爽的是不支持外键约束。

◇网络文件系统(以下简称NFS)
有时候需要访问其它机器上的SQLite数据库文件,就会把数据库文件放置到网络共享目录上。这时候你就要小心了。当SQLite文件放置于NFS时,在并发读写的情况下可能会出问题(比如数据损坏)。原因据说是由于某些NFS的文件锁实现上有Bug。

★编程语言接口
SQLite支持很多种语言的编程接口。这对于我这种喜欢混用多种编程语言的人来说,是很爽的。下面我大概介绍一下。

◇C/C++
由于SQLite本身是C写的,它自带的API也是C接口的。所以C/C++用起来最直接了。假如你不喜欢面向过程的C API风格,可以另外找个C++的包装库。想重新发明轮子的同学,也可以自己包装一个。
◇Java
如果要用Java访问SQLite,可以通过SQLite的JDBC驱动,或者通过专门的SQLite包装库。我个人建议走JDBC方式,万一将来要换数据库,代码就不用大改。
◇Python
pysqlite是Python操作SQLite的首选。从Python 2.5开始,它已经被整合到Python的标准库中。看来Python社区还是蛮喜欢SQLite嘛。
◇dotNet
对于喜欢dotNet的同学,可以通过SQLite的ADO.NET驱动来访问。
◇Ruby
Ruby可以通过SQLite-Ruby操作SQLite数据库,不过我没用过。
◇Perl
在CPAN上有DBD::SQLite,不过我也没用过。

★一些非技术的参考因素
前面讲的都是技术层面的话题,如果你考虑在公司的商业软件项目中使用SQLite。还需要根据“如何选择开源项目”里面提到的几个参考因素,再评估一下。
◇授权协议(License)
SQLite使用的是Public Domain协议,这是最爽一种,可以放心大胆地用。
◇用户的普及程度
最近这几年,使用SQLite的人越来越多(从Google Trends可以反应出来)。包括一些大公司也开始把它整合到产品中(比如Google的Gears、Apple的Safari、Adobe的AIR)。这说明它的健壮性、稳定性等方面不会有太大问题。
◇开发的活跃程度
如果到SQLite的Change Log上大致了解一下,可以看出最近5年基本上每1-2个月都会有更新。说明开发的活跃度还是非常高的。
从上述几个非技术因素来看,SQLite用于商业公司的软件项目还是非常靠谱的。

echohi SQLite

嵌入式数据库 SQLite 简介

2009年12月16日

自几十年前出现的商业应用程序以来,数据库就成为软件应用程序的主要组成部分。正与数据库管理系统非常关键一样,它们也变得非常庞大,并占用了相当多的系统资源,增加了管理的复杂性。随着软件应用程序逐渐模块模块化,一种新型数据库会比大型复杂的传统数据库管理系统更适应。嵌入式数据库直接在应用程序进程中运行,提供了零配置(zero-configuration)运行模式,并且资源占用非常少。本文将介绍流行的 SQLite 数据库引擎,并描述如何在应用程序开发中使用它。

SQLite 是 D. Richard Hipp 用 C 语言编写的开源嵌入式数据库引擎。它是完全独立的,不具有外部依赖性。SQLite 支持多数 SQL92 标准,可以在所有主要的操作系统上运行,并且支持大多数计算机语言。SQLite 还非常健壮。其创建者保守地估计 SQLite 可以处理每天负担多达 100,00 次点击率的 Web 站点,并且 SQLite 有时候可以处理 10 倍于上述数字的负载。

SQLite是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如Tcl、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源世界著名的数据库管理系统来讲,它的处理速度比他们都快。

SQLite虽然很小巧,但是支持的SQL语句不会逊色于其他开源数据库,它支持的SQL包括:

ATTACH DATABASE
BEGIN TRANSACTION

comment

COMMIT TRANSACTION
COPY
CREATE INDEX
CREATE TABLE
CREATE TRIGGER
CREATE VIEW
DELETE
DETACH DATABASE
DROP INDEX
DROP TABLE
DROP TRIGGER
DROP VIEW
END TRANSACTION
EXPLAIN

expression

INSERT
ON CONFLICT clause
PRAGMA
REPLACE
ROLLBACK TRANSACTION
SELECT
UPDATE

同时它还支持事务处理功能等等。也有人说它象Microsoft的Access,有时候真的觉得有点象,但是事实上它们区别很大。比如SQLite 支持跨平台,操作简单,能够使用很多语言直接创建数据库,而不象Access一样需要Office的支持。如果你是个很小型的应用,或者你想做嵌入式开发,没有合适的数据库系统,那么现在你可以考虑使用SQLite。

SQLite 内部结构
在内部,SQLite 由以下几个组件组成:SQL 编译器、内核、后端以及附件。SQLite 通过利用虚拟机和虚拟数据库引擎(VDBE),使调试、修改和扩展 SQLite 的内核变得更加方便。所有 SQL 语句都被编译成易读的、可以在 SQLite 虚拟机中执行的程序集。

SQLite 支持大小高达 2 TB 的数据库,每个数据库完全存储在单个磁盘文件中。这些磁盘文件可以在不同字节顺序的计算机之间移动。这些数据以 B+树(B+tree)数据结构的形式存储在磁盘上。SQLite 根据该文件系统获得其数据库权限。

SQLite 数据类型
SQLite 不支持静态数据类型,而是使用列关系。这意味着它的数据类型不具有表列属性,而具有数据本身的属性。当某个值插入数据库时,SQLite 将检查它的类型。如果该类型与关联的列不匹配,则 SQLite 会尝试将该值转换成列类型。如果不能转换,则该值将作为其本身具有的类型存储。

SQLite 支持 NULL、INTEGER、REAL、TEXT 和 BLOB 数据类型。

由于资源占用少、性能良好和零管理成本,嵌入式数据库有了它的用武之地,它将为那些以前无法提供用作持久数据的后端的数据库的应用程序提供了高效的性能。现在,没有必要使用文本文件来实现持久存储。SQLite 之类的嵌入式数据库的易于使用性可以加快应用程序的开发,并使得小型应用程序能够完全支持复杂的 SQL。这一点对于对于小型设备空间的应用程序来说尤其重要。

嵌入式数据库对于加快应用程序开发也很重要,尤其是在用于数据库抽象层(例如 PEAR::DB 或 ezSQL)时。最后,SQLite 正在积极开发中,未来一定会有新的功能,会对开源社区更有用。

echohi SQLite ,

Linux tar 压缩打包命令使用方法

2009年12月11日

tar命令

[root@linux ~]# tar [-cxtzjvfpPN] 文件与目录 ….
参数:
-c :建立一个压缩文件的参数指令(create 的意思);
-x :解开一个压缩文件的参数指令!
-t :查看 tarfile 里面的文件!
特别注意,在参数的下达中, c/x/t 仅能存在一个!不可同时存在!
因为不可能同时压缩与解压缩。
-z :是否同时具有 gzip 的属性?亦即是否需要用 gzip 压缩?
-j :是否同时具有 bzip2 的属性?亦即是否需要用 bzip2 压缩?
-v :压缩的过程中显示文件!这个常用,但不建议用在背景执行过程!
-f :使用档名,请留意,在 f 之后要立即接档名喔!不要再加参数!
例如使用『 tar -zcvfP tfile sfile』就是错误的写法,要写成
『 tar -zcvPf tfile sfile』才对喔!
-p :使用原文件的原来属性(属性不会依据使用者而变)
-P :可以使用绝对路径来压缩!
-N :比后面接的日期(yyyy/mm/dd)还要新的才会被打包进新建的文件中!
–exclude FILE:在压缩的过程中,不要将 FILE 打包!
范例:
范例一:将整个 /etc 目录下的文件全部打包成为 /tmp/etc.tar
[root@linux ~]# tar -cvf /tmp/etc.tar /etc <==仅打包,不压缩!
[root@linux ~]# tar -zcvf /tmp/etc.tar.gz /etc <==打包后,以 gzip 压缩
[root@linux ~]# tar -jcvf /tmp/etc.tar.bz2 /etc <==打包后,以 bzip2 压缩
# 特别注意,在参数 f 之后的文件档名是自己取的,我们习惯上都用 .tar 来作为辨识。
# 如果加 z 参数,则以 .tar.gz 或 .tgz 来代表 gzip 压缩过的 tar file ~
# 如果加 j 参数,则以 .tar.bz2 来作为附档名啊~
# 上述指令在执行的时候,会显示一个警告讯息:
# 『tar: Removing leading `/’ from member names』那是关於绝对路径的特殊设定。

范例二:查阅上述 /tmp/etc.tar.gz 文件内有哪些文件?
[root@linux ~]# tar -ztvf /tmp/etc.tar.gz
# 由於我们使用 gzip 压缩,所以要查阅该 tar file 内的文件时,
# 就得要加上 z 这个参数了!这很重要的!

范例三:将 /tmp/etc.tar.gz 文件解压缩在 /usr/local/src 底下
[root@linux ~]# cd /usr/local/src
[root@linux src]# tar -zxvf /tmp/etc.tar.gz
# 在预设的情况下,我们可以将压缩档在任何地方解开的!以这个范例来说,
# 我先将工作目录变换到 /usr/local/src 底下,并且解开 /tmp/etc.tar.gz ,
# 则解开的目录会在 /usr/local/src/etc 呢!另外,如果您进入 /usr/local/src/etc
# 则会发现,该目录下的文件属性与 /etc/ 可能会有所不同喔!

范例四:在 /tmp 底下,我只想要将 /tmp/etc.tar.gz 内的 etc/passwd 解开而已
[root@linux ~]# cd /tmp
[root@linux tmp]# tar -zxvf /tmp/etc.tar.gz etc/passwd
# 我可以透过 tar -ztvf 来查阅 tarfile 内的文件名称,如果单只要一个文件,
# 就可以透过这个方式来下达!注意到! etc.tar.gz 内的根目录 / 是被拿掉了!

范例五:将 /etc/ 内的所有文件备份下来,并且保存其权限!
[root@linux ~]# tar -zxvpf /tmp/etc.tar.gz /etc
# 这个 -p 的属性是很重要的,尤其是当您要保留原本文件的属性时!

范例六:在 /home 当中,比 2005/06/01 新的文件才备份
[root@linux ~]# tar -N ‘2005/06/01′ -zcvf home.tar.gz /home

范例七:我要备份 /home, /etc ,但不要 /home/dmtsai
[root@linux ~]# tar –exclude /home/dmtsai -zcvf myfile.tar.gz /home/* /etc

范例八:将 /etc/ 打包后直接解开在 /tmp 底下,而不产生文件!
[root@linux ~]# cd /tmp
[root@linux tmp]# tar -cvf – /etc | tar -xvf -
# 这个动作有点像是 cp -r /etc /tmp 啦~依旧是有其有用途的!
# 要注意的地方在於输出档变成 – 而输入档也变成 – ,又有一个 | 存在~
# 这分别代表 standard output, standard input 与管线命令啦!
# 这部分我们会在 Bash shell 时,再次提到这个指令跟大家再解释啰!

gzip, zcat 命令

[root@linux ~]# gzip [-cdt#] 档名
[root@linux ~]# zcat 档名.gz
参数:
-c :将压缩的资料输出到萤幕上,可透过资料流重导向来处理;
-d :解压缩的参数;
-t :可以用来检验一个压缩档的一致性~看看文件有无错误;
-# :压缩等级,-1 最快,但是压缩比最差、-9 最慢,但是压缩比最好!预设是 -6 ~
范例:
范例一:将 /etc/man.config 複制到 /tmp ,并且以 gzip 压缩
[root@linux ~]# cd /tmp
[root@linux tmp]# cp /etc/man.config .
[root@linux tmp]# gzip man.config
# 此时 man.config 会变成 man.config.gz !

范例二:将范例一的文件内容读出来!
[root@linux tmp]# zcat man.config.gz
# 此时萤幕上会显示 man.config.gz 解压缩之后的文件内容!!

范例三:将范例一的文件解压缩
[root@linux tmp]# gzip -d man.config.gz

范例四:将范例三解开的 man.config 用最佳的压缩比压缩,并保留原本的文件
[root@linux tmp]# gzip -9 -c man.config > man.config.gz

bzip2, bzcat 命令

[root@linux ~]# bzip2 [-cdz] 档名
[root@linux ~]# bzcat 档名.bz2
参数:
-c :将压缩的过程产生的资料输出到萤幕上!
-d :解压缩的参数
-z :压缩的参数
-# :与 gzip 同样的,都是在计算压缩比的参数, -9 最佳, -1 最快!
范例:
范例一:将刚刚的 /tmp/man.config 以 bzip2 压缩
[root@linux tmp]# bzip2 -z man.config
# 此时 man.config 会变成 man.config.bz2 !

范例二:将范例一的文件内容读出来!
[root@linux tmp]# bzcat man.config.bz2
# 此时萤幕上会显示 man.config.bz2 解压缩之后的文件内容!!

范例三:将范例一的文件解压缩
[root@linux tmp]# bzip2 -d man.config.bz2

范例四:将范例三解开的 man.config 用最佳的压缩比压缩,并保留原本的文件
[root@linux tmp]# bzip2 -9 -c man.config > man.config.bz2

compress 命令

[root@linux ~]# bzip2 [-cdz] 档名
[root@linux ~]# bzcat 档名.bz2
参数:
-c :将压缩的过程产生的资料输出到萤幕上!
-d :解压缩的参数
-z :压缩的参数
-# :与 gzip 同样的,都是在计算压缩比的参数, -9 最佳, -1 最快!
范例:
范例一:将刚刚的 /tmp/man.config 以 bzip2 压缩
[root@linux tmp]# bzip2 -z man.config
# 此时 man.config 会变成 man.config.bz2 !

范例二:将范例一的文件内容读出来!
[root@linux tmp]# bzcat man.config.bz2
# 此时萤幕上会显示 man.config.bz2 解压缩之后的文件内容!!

范例三:将范例一的文件解压缩
[root@linux tmp]# bzip2 -d man.config.bz2

范例四:将范例三解开的 man.config 用最佳的压缩比压缩,并保留原本的文件
[root@linux tmp]# bzip2 -9 -c man.config > man.config.bz2

dd 命令

[root@linux ~]# dd if=”input_file” of=”outptu_file” bs=”block_size” \
count=”number”
参数:
if :就是 input file 啰~也可以是装置喔!
of :就是 output file 喔~也可以是装置;
bs :规划的一个 block 的大小,如果没有设定时,预设是 512 bytes
count:多少个 bs 的意思。
范例:

范例一:将 /etc/passwd 备份到 /tmp/passwd.back 当中
[root@linux ~]# dd if=/etc/passwd of=/tmp/passwd.back
3+1 records in
3+1 records out
[root@linux ~]# ll /etc/passwd /tmp/passwd.back
-rw-r–r– 1 root root 1746 Aug 25 14:16 /etc/passwd
-rw-r–r– 1 root root 1746 Aug 29 16:57 /tmp/passwd.back
# 仔细的看一下,我的 /etc/passwd 文件大小为 1746 bytes,因为我没有设定 bs ,
# 所以预设是 512 bytes 为一个单位,因此,上面那个 3+1 表示有 3 个完整的
# 512 bytes,以及未满 512 bytes 的另一个 block 的意思啦!
# 事实上,感觉好像是 cp 这个指令啦~

范例二:备份 /dev/hda 的 MBR
[root@linux ~]# dd if=/dev/hda of=/tmp/mbr.back bs=512 count=1
1+0 records in
1+0 records out
# 这就得好好瞭解一下啰~我们知道整颗硬盘的 MBR 为 512 bytes,
# 就是放在硬盘的第一个 sector 啦,因此,我可以利用这个方式来将
# MBR 内的所有资料都纪录下来,真的很厉害吧! ^_^

范例三:将整个 /dev/hda1 partition 备份下来。
[root@linux ~]# dd if=/dev/hda1 of=/some/path/filenaem
# 这个指令很厉害啊!将整个 partition 的内容全部备份下来~
# 后面接的 of 必须要不是在 /dev/hda1 的目录内啊~否则,怎么读也读不完~
# 这个动作是很有效用的,如果改天你必须要完整的将整个 partition 的内容填回去,
# 则可以利用 dd if=/some/file of=/dev/hda1 来将资料写入到硬盘当中。
# 如果想要整个硬盘备份的话,就类似 Norton 的 ghost 软体一般,
# 由 disk 到 disk ,嘿嘿~利用 dd 就可以啦~厉害厉害!

cpio 命令

[root@linux ~]# cpio -covB > [file|device] <==备份
[root@linux ~]# cpio -icduv < [file|device] <==还原
参数:
-o :将资料 copy 输出到文件或装置上
-i :将资料自文件或装置 copy 出来系统当中
-t :查看 cpio 建立的文件或装置的内容
-c :一种较新的 portable format 方式储存
-v :让储存的过程中文件名称可以在萤幕上显示
-B :让预设的 Blocks 可以增加至 5120 bytes ,预设是 512 bytes !
这样的好处是可以让大文件的储存速度加快(请参考 i-nodes 的观念)
-d :自动建立目录!由於 cpio 的内容可能不是在同一个目录内,
如此的话在反备份的过程会有问题! 这个时候加上 -d 的话,
就可以自动的将需要的目录建立起来了!
-u :自动的将较新的文件覆盖较旧的文件!
范例:
范例一:将所有系统上的资料通通写入磁带机内!
[root@linux ~]# find / -print | cpio -covB > /dev/st0
# 一般来说,使用 SCSI 介面的磁带机,代号是 /dev/st0 喔!

范例二:检查磁带机上面有什么文件?
[root@linux ~]# cpio -icdvt < /dev/st0
[root@linux ~]# cpio -icdvt < /dev/st0 > /tmp/content
# 第一个动作当中,会将磁带机内的档名列出到萤幕上面,而我们可以透过第二个动作,
# 将所有的档名通通纪录到 /tmp/content 文件去!

范例三:将磁带上的资料还原回来~
[root@linux ~]# cpio -icduv < /dev/st0
# 一般来说,使用 SCSI 介面的磁带机,代号是 /dev/st0 喔!

范例四:将 /etc 底下的所有『文件』都备份到 /root/etc.cpio 中!
[root@linux ~]# find /etc -type f | cpio -o > /root/etc.cpio
# 这样就能够备份啰~您也可以将资料以 cpio -i < /root/etc.cpio
# 来将资料捉出来!!!!

echohi Linux , , ,

FckEditor(CKEditor)配置

2009年12月10日

FckEditor更名CKEditor
著名的开源网页编辑软件FCKEditor在09年发布更新到3.0,并改名为CKEditor。原来叫FCK,是因为最初的开发者叫Frederico Calderia Knabben;现在叫CK,意指”Content and Knowledge”。新版的编辑器的更新包括:新的用户界面,一个支持Plug-in的Javascript API,并提供对视觉障碍者的使用支持。”
据官方的解释,CK是对FCK的代码的完全重写,而且此项工作从2007年就开始了,并在今年初发表了多个测试版。至此,为大家服务长达6年的FCKeditor将被CKeditor替代。

配置中文解释

AutoDetectLanguage=true/false 自动检测语言
BaseHref=”" 相对链接的基地址
ContentLangDirection=”ltr/rtl” 默认文字方向
ContextMenu=字符串数组,右键菜单的内容
CustomConfigurationsPath=”" 自定义配置文件路径和名称
Debug=true/false 是否开启调试功能,这样,当调用FCKDebug.Output()时,会在调试窗中输出内容
DefaultLanguage=”" 缺省语言
EditorAreaCss=”" 编辑区的样式表文件
EnableSourceXHTML=true/false 为TRUE时,当由可视化界面切换到代码页时,把HTML处理成XHTML
EnableXHTML=true/false 是否允许使用XHTML取代HTML
FillEmptyBlocks=true/false 使用这个功能,可以将空的块级元素用空格来替代
FontColors=”" 设置显示颜色拾取器时文字颜色列表
FontFormats=”" 设置显示在文字格式列表中的命名
FontNames=”" 字体列表中的字体名
FontSizes=”" 字体大小中的字号列表
ForcePasteAsPlainText=true/false 强制粘贴为纯文本
ForceSimpleAmpersand=true/false 是否不把&符号转换为XML实体
FormatIndentator=”" 当在源码格式下缩进代码使用的字符
FormatOutput=true/false 当输出内容时是否自动格式化代码
FormatSource=true/false 在切换到代码视图时是否自动格式化代码
FullPage=true/false 是否允许编辑整个HTML文件,还是仅允许编辑BODY间的内容
GeckoUseSPAN=true/false 是否允许SPAN标记代替B,I,U标记
IeSpellDownloadUrl=”"下载拼写检查器的网址
ImageBrowser=true/false 是否允许浏览服务器功能
ImageBrowserURL=”" 浏览服务器时运行的URL
ImageBrowserWindowHeight=”" 图像浏览器窗口高度
ImageBrowserWindowWidth=”" 图像浏览器窗口宽度
LinkBrowser=true/false 是否允许在插入链接时浏览服务器
LinkBrowserURL=”" 插入链接时浏览服务器的URL
LinkBrowserWindowHeight=”"链接目标浏览器窗口高度
LinkBrowserWindowWidth=”"链接目标浏览器窗口宽度
Plugins=object 注册插件
PluginsPath=”" 插件文件夹
ShowBorders=true/false 合并边框
SkinPath=”" 皮肤文件夹位置
SmileyColumns=12 图符窗列数
SmileyImages=字符数组 图符窗中图片文件名数组
SmileyPath=”" 图符文件夹路径
SmileyWindowHeight 图符窗口高度
SmileyWindowWidth 图符窗口宽度
SpellChecker=”ieSpell/Spellerpages” 设置拼写检查器
StartupFocus=true/false 开启时FOCUS到编辑器
StylesXmlPath=”" 设置定义CSS样式列表的XML文件的位置
TabSpaces=4 TAB键产生的空格字符数
ToolBarCanCollapse=true/false 是否允许展开/折叠工具栏
ToolbarSets=object 允许使用TOOLBAR集合
ToolbarStartExpanded=true/false 开启是TOOLBAR是否展开
UseBROnCarriageReturn=true/false 当回车时是产生BR标记还是P或者DIV标记

自定义工具条

Source=”页面源码”
DocProps=”页面属性”
Save=”保存”
NewPage=”新建”
Preview=”预览”
Templates=”模版”
Cut=”剪切”
Copy=”拷贝”
Paste=”粘贴”
PasteText=”粘贴为无格式的文本”
PasteWord=”粘贴Word格式”
Print=”打印”
SpellCheck=”拼写检查,要装插件”
Undo=”撤消”
Redo=”重做”
Find=”查找”
Replace=”替换”
SelectAll=”全选”
RemoveFormat=”清除格式(清除现在文本的格式)”
Form=”表单域”
Checkbox=”复选”
Radio=”单选”
TextField=”单行文本”
Textarea=”多行文本”
Select=”列表”
Button=”按钮”
ImageButton=”图像区域”
HiddenField=”隐藏域”
Bold=”加粗”
Italic=”倾斜”
Underline=”下划线”
StrikeThrough=”删除线”
Subscript=”下标”
Superscript=”上标”
OrderedList=”删除/插入项目列表”
UnorderedList=”删除/插入项目符号”
Outdent=”减少缩进”
Indent=”增加缩进”
JustifyLeft=”左对齐”
JustifyCenter=”居中对齐”
JustifyRight=”右对齐”
JustifyFull=”分散对齐”
Link=”链接”
Unlink=”删除链接”
Anchor=”插入/删除锚点”
Image=”上传图片”
Flash=”上传动画”
Table=”插入表格”
Rule=”插入水平线”
Smiley=”插入表情”
SpecialChar=”插入特殊字符”
PageBreak=”插入分页符”
Style=”样式”
FontFormat=”格式”
FontName=”字体”
FontSize=”大小”
TextColor=”字体颜色”
BGColor=”背景色”
FitWindow=”全屏编辑”
About=”关于我们”

JS实例

<textarea name=”textarea” id=”content” name=”content” style=”width:630px;”></textarea>
<script type=”text/javascript”>
CKEDITOR.replace( ‘content’,
{
extraPlugins : ‘uicolor’,
uiColor: ‘#CCCCCC’,
toolbar :
[
[ 'Source', '-', 'FontSize', 'TextColor', '-', , 'Bold', 'Italic', '-', 'JustifyLeft', 'JustifyCenter', 'JustifyRight', '-', 'NumberedList', 'BulletedList', '-', 'Link', 'Unlink' ]
]
} );
</script>

echohi Html

笑话一则:打个半死

2009年12月3日

一个富人对一个贪财者说:“我送你1000两银子,让我把你打死,行吗?”
贪财者答道:“我只要你500两银子。”
富人说:“为啥?”
答道:“请你把我打个半死。”

echohi 随笔

Zend Studio 实用快捷键

2009年12月2日
编辑功能
组合键 实现功能 适用条件
Ctrl+/ 单行注释。当前为php代码时,则在光标所在行添加双斜杠行注释,选择多行则每一行都添加双斜杠;而当代码为html时则在行前后添加<!– –>注释,选中多行将在选区前后添加<!– –>注释,而非每行添加 PHP代码、html代码全部适用,不适用于CSS部分
Ctrl+Shift+/ 块注释,为选择的PHP代码添加/* */块注释,如果没有选择任何代码,则将光标所在行添加块注释 PHP代码适用,对HTML代码其功能与Ctrl+/相同
Ctrl+U 选择的代码片段全部转换为大写 php、html等均适用
Ctrl+L 选择的代码片段全部转换为小写 php、html等均适用
Ctrl+D 复制光标所在行 所有代码均适用
Ctrl+E 删除光标所在行 所有代码均适用
Tab/Shift+Tab 按tab增加代码缩进,默认为4个空格位置,可在首选项中进行设置,Shift+Tab则减少缩进,此操作对多行操作同样有效。即多行同时增加/减少缩进。 所有代码均适用
Ctrl+Alt+F 在文件中查找,打开“在文件中查找”对话框 整个ZDE环境适用
Ctrl+BackSpace 删除光标前一个单词,或者一个符号,注意这里的“一个单词”是由ZDE自行理解的,与英文中的一个单词有一定出入 所有代码均适用
Ctrl+G 转到行。打开转到行对话框,填写行数字即可转到相应行,此为通用快捷键 整个ZDE环境适用
Alt+ →,← 右箭头是定位到光标的下一个位置,左箭头则是定位到光标的上一个位置。 整个ZDE环境适用
环境切换
组合键 实现功能 适用条件
Esc 隐藏辅助窗口,以便让编辑区域最大,而文件管理器窗口不会隐藏 整个ZDE环境适用
Ctrl+W 切换自动换行,即当代码超长时是否出现横向滚动条
Ctrl+Tab 在各个编辑器标签页之间切换,也可描述为在多个打开的文件窗口间切换
Ctrl+F4 关闭当前标签页,Alt+F4是关闭整个ZDE环境,注意下区别
HTML标记
组合键 实现功能 适用条件
Ctrl+1,2,3 分别添加一对<h1>、<h2>、<h3> html标签, 所有代码部分
Ctrl+Enter 断行,即产生一个<br />标签,这里注意ZDE自动产生的为<br>标签,不符合web标准
Ctrl+~ 空格即一个 注意:~键位于PC键盘数字1左侧,tab键上方
Ctrl+B 粗体,产生一对<b>标签,web标准似乎提倡使用<strong></strong>
Alt+I 斜体,产生一对<i>标签
书签操作
组合键 实现功能 适用条件
F2 添加/删除书签 所有代码部分
Ctrl+F2 跳到当前文件的下一个书签
Alt+F2 在当前项目的所有书签间切换
Ctrl+Shift+F2 删除所有书签
Ctrl+Shift+M 显示书签对话框
Zend Studio调试快捷键列表
组合键 实现功能 适用条件
F9 添加/删除断点 所有代码部分
F10 逐过程。单步执行调试文件到下一行
F5 开始执行。执行调试文件,直到遇到断点。
F8 调试URL。打开调试URL对话框
F12 概要文件URL。打开profile URL对话框
Shift+F8 添加监视点。打开添加监视点对话框
Shift+F11 跳出。单步执行到返回后执行的第一行
F11 逐语句。单步执行到下一被执行的行
Shift+F10 执行到光标行。执行代码到光标所在行。
Ctrl+F5 无中断的执行脚本
Shift+F5 停止调试器
Ctrl+Alt+B 在浏览器中显示

注:调试快捷键只有在调试代码的时候才会用到

echohi ZendStudio ,

工作中的两个低级错误

2009年11月28日

昨天评论页面改版中,提取评论排行榜信息时为了本地调试方便时实提取数据,使用$MEM->delete($key);将缓存清除,上线时居然忘记了注释到,上线后马上造成评论系统无法响应请求。

子论坛发贴中有用户在源码模式发布媒体对象标签<embed,于是想到使用preg_replace将其过滤掉,找到相应数据提取位置,三行代码写完,本地测试OK,传上服务器上的居然不志作用,查看源码<embed还在,感觉很是奇怪,打印出相关数据才发现,原数据是<EMBED,而经过解析后源码里已经是小写了,而自己在正则里也没用使用i修正符,造成不必要的工作开销。

echohi 工作

VIM设置代码折叠(转)

2009年11月22日

1. 折叠方式
可用选项 ‘foldmethod’ 来设定折叠方式:set fdm=*****。
有 6 种方法来选定折叠:
manual           手工定义折叠
indent             更多的缩进表示更高级别的折叠
expr                用表达式来定义折叠
syntax             用语法高亮来定义折叠
diff                  对没有更改的文本进行折叠
marker            对文中的标志折叠
注意,每一种折叠方式不兼容,如不能即用expr又用marker方式,我主要轮流使用indent和marker方式进行折叠。

使用时,用:set fdm=marker 命令来设置成marker折叠方式(fdm是foldmethod的缩写)。
要使每次打开vim时折叠都生效,则在.vimrc文件中添加设置,如添加:set fdm=syntax,就像添加其它的初始化设置一样。

2. 折叠命令
选取了折叠方式后,我们就可以对某些代码实施我们需要的折叠了,由于我使用indent和marker稍微多一些,故以它们的使用为例:
如果使用了indent方式,vim会自动的对大括号的中间部分进行折叠,我们可以直接使用这些现成的折叠成果。
在可折叠处(大括号中间):
zc      折叠
zC     对所在范围内所有嵌套的折叠点进行折叠
zo      展开折叠
zO     对所在范围内所有嵌套的折叠点展开
[z       到当前打开的折叠的开始处。
]z       到当前打开的折叠的末尾处。
zj       向下移动。到达下一个折叠的开始处。关闭的折叠也被计入。
zk      向上移动到前一折叠的结束处。关闭的折叠也被计入。

当使用marker方式时,需要用标计来标识代码的折叠,系统默认是{{{和}}},最好不要改动之:)
我们可以使用下面的命令来创建和删除折叠:
zf      创建折叠,比如在marker方式下:
zf56G,创建从当前行起到56行的代码折叠;
10zf或10zf+或zf10↓,创建从当前行起到后10行的代码折叠。
10zf-或zf10↑,创建从当前行起到之前10行的代码折叠。
在括号处zf%,创建从当前行起到对应的匹配的括号上去((),{},[],<>等)。
zd      删除 (delete) 在光标下的折叠。仅当 ‘foldmethod’ 设为 “manual” 或 “marker” 时有效。
zD     循环删除 (Delete) 光标下的折叠,即嵌套删除折叠。
仅当 ‘foldmethod’ 设为 “manual” 或 “marker” 时有效。
zE     除去 (Eliminate) 窗口里“所有”的折叠。
仅当 ‘foldmethod’ 设为 “manual” 或 “marker” 时有效。

echohi Vim

apache2: Could not reliably determine the server’s fully qualified domain name,using xxx.xxx.xxx.xx for ServerName

2009年11月13日

在Apache2配置文件httpd.conf或Apache2.conf中加入提示ServeName,如下

ServerName xxx.xxx.xxx.xx

重启系统即可。

echohi Apache