ftp基本知识vsftpd的名字代表“very secure FTP daemon”,它的开发者Chris Evans考虑的首要问题就是数据传输的安全性。所以,在上述所有的特性当中,较高的安全性是处于最重要的地位。vsftpd比其他诸如Wu-ftpd和 Proftpd之类的FTP服务器更加优越。另外,在速度方面,据统计,使用ASCⅡ模式下载数据的速度是Wu-ftpd的两倍。在Linux2.4系列版本的内核下,千兆以太网的下载速度可以达到86MB/S;在稳定性方面,根据ftp.redhat.com的数据,它可以支持15000个并发用户,所以其总体性能也是非常高的,vsftpd在安全性、高性能及稳定性三个方面有上佳的表现。它提供的主要功能包括虚拟IP设置、虚拟用户、Standalone、inetd操作模式、强大的单用户设置能力及带宽限流等。在安全方面,它从原理上修补了大多数Wu-FTP、ProFTP,乃至BSD-FTP的安装缺陷,使用安全编码技术解决了缓冲溢出问题,并能有效避免“globbing”类型的拒绝服务攻击。目前正在使用vsftpd的官方网站有Red Hat、SuSE、Debian、GNU、GNOME、KDE、Gimp和OpenBSD等。
linux里有三个主要的FTP服务器,分别是VsFTPd、ProFTPd和Pure-FTPd,其中VsFTPd以安全和性能著称,ProFTPd则以众多的特性取胜,Pure-FTPd的性能和特性介乎两者中间
论坛很多都是介绍怎么配置ftp的,这里就只说下关于ftp的一点基本知识
ftp使用者的分类,根据服务器对象的不同将ftp使用者分为3类
1:本地用户(real用户)
2:虚拟用户(guest用户)
3:匿名用户
本地用户:如果用户在远程ftp服务器上拥有服务器的本地帐号,本地用户可以通过输入自己的帐号和口令来进行授权登陆
虚拟用户:如果用户在远程ftp服务器上拥有帐号,且此帐号只能用于文件的传输服务,则称此用户为虚拟用户或guest用户(实际多个虚拟用户只是本地一个用户的影射)
匿名用户:如果用户在远程ftp服务器上没有帐号,则称此用户为匿名用户
ftp协议中定义的典型消息,用来判断问题
125 :数据连接打开,传输开始
200 :命令ok
226 :数据传输完毕
331 :用户名OK,需要输入密码
425 :不能打开数据连接
426 :数据连接被关闭,传输被中断
452 :错误写文件
500 :语法错误,不可识别的命令
530 :未登入。
基本命令:
这里说下建立ftp可能会涉及到的一些命令
ls (显示目录列表,如果太多,可以使用分页命令:ls /etc | more ,按q结束)
touch (建立文件,注意是文件,不是目录)
cp (复制文件或目录,如:cp /etc/vsftpd.conf /home/xxx 复制vsftpd.conf到/home/xxx目录下)
mv (移动文件或目录或改名 如:mv /home/xxx.conf /etc/ 移动/home/xxx.conf到/etc下)
rm (删除文件或目录 如果删除目录需要加 -R 参数)
cd (切换路径,可以用tab键补全路径 cd ..代表退到上个路径)
mkdir (建立目录)
chown (改变目录或文件所有者,如 sudo chown root.root /etc/vsftpd.conf 所有者和组都为root)
chmod (改变目录或文件权限,配合ls -l使用)
(如,chmod ugo+rwx /home/ftp/xxx
u:文件或目录所有者的权限
g:组的权限
o:其他用户权限
+添加权限
-减少权限
r w x (读,写,执行)
)
ls -l (查看文件或目录权限等信息
ftp的数据传输模式
可能很多人都感到pasv_enable这个参数很奇怪,只是默认是打开的,所以很多人不关心它
这里就要说下ftp的传输模式,分为2种模式
1:主动模式(Active FTP)
2:被动模式(Passive FTP)
主动模式:简单说就是客户提交请求到服务器21端口,然后监听,服务器用默认20端口连接客户监听的端口,进 行数据传输
就是说是服务器向客户发起一个用于传输的连接。
被动模式:客户提交请求到服务器21端口,然后开启x端口,再向服务器发送PASV命令,告诉服务器自己处于被动模式,服务器收到命令,就会开放一个p端口监听,然后通知客户自己数据端口p,客户收到命令,又会开启一个端口v进行连接服务器的p端口,然后两个v-p端口进行数据传输,就是说数据传输是客户发起的,相对服务器就是被动的。
(被动模式通常用在处于防火墙之后的FTP客户端访问外界FTP服务器的情况,因为防火墙通常配置是不允许外界访问防火墙之后的机器,只允许由防火墙之后的主机发起的连接请求)
vsftpd主配置文件常用参数说明:
listen=<YES/NO> :设置为YES时vsftpd以独立运行方式启动,设置为NO时以xinetd方式启动(xinetd是管理守护进程的,将服务集中管理,可以减少大量服务的资源消耗)
listen_port=<port> :设置控制连接的监听端口号,默认为21
listen_address=<ip address> :将在绑定到指定IP地址运行,适合多网卡
connect_from_port_20=<YES/NO> :若为YES,则强迫FTP-DATA的数据传送使用port 20,默认YES
pasv_enable=<YES/NO> :是否使用被动模式的数据连接,如果客户机在防火墙后,请开启为YES
pasv_min_port=<n>
pasv_max_port=<m> :设置被动模式后的数据连接端口范围在n和m之间,建议为50000-60000端口
message_file=<filename> :设置使用者进入某个目录时显示的文件内容,默认为 .message
dirmessage_enable=<YES/NO> :设置使用者进入某个目录时是否显示由message_file指定的文件内容
ftpd_banner=<message> :设置用户连接服务器后的显示信息,就是欢迎信息
banner_file=<filename> :设置用户连接服务器后的显示信息存放在指定的filename文件中
connect_timeout=<n> :如果客户机连接服务器超过N秒,则强制断线,默认60
accept_timeout=<n> :当使用者以被动模式进行数据传输时,服务器发出passive port指令等待客户机超过N秒,则强制断线,默认60
accept_connection_timeout=<n> :设置空闲的数据连接在N秒后中断,默认120
data_connection_timeout=<n> : 设置空闲的用户会话在N秒后中断,默认300
max_client=<n> : 在独立启动时限制服务器的连接数,0表示无限制
max_per_ip=<n> :在独立启动时限制客户机每IP的连接数,0表示无限制(不知道是否跟多线程下载有没干系)
local_enable=<YES/NO> :设置是否支持本地用户帐号访问
guest_enable=<YES/NO> :设置是否支持虚拟用户帐号访问
write_enable=<YES/NO> :是否开放本地用户的写权限
local_umask=<nnn> :设置本地用户长传的文件的生成掩码,默认为077
local_max_rate<n> :设置本地用户最大的传输速率,单位为bytes/sec,值为0表示不限制
local_root=<file> :设置本地用户登陆后的目录,默认为本地用户的主目录
chroot_local_user=<YES/NO> :当为YES时,所有本地用户可以执行chroot
chroot_list_enable=<YES/NO>
chroot_list_file=<filename> :当chroot_local_user=NO 且 chroot_list_enable=YES时,只有filename文件指定的用户可以执行chroot
anonymous_enable=<YES/NO> :设置是否支持匿名用户访问
anon_max_rate=<n> :设置匿名用户的最大传输速率,单位为B/s,值为0表示不限制
anon_world_readable_only=<YES/NO> 是否开放匿名用户的浏览权限
anon_upload_enable=<YES/NO> 设置是否允许匿名用户上传
anon_mkdir_write_enable=<YES/NO> :设置是否允许匿名用户创建目录
anon_other_write_enable=<YES/NO> :设置是否允许匿名用户其他的写权限(注意,这个在安全上比较重要,一般不建议开,不过关闭会不支持续传)
anon_umask=<nnn> :设置匿名用户上传的文件的生成掩码,默认为077
anon_root=<file> :设置匿名用户登陆后的目录
no_anon_password=<YES/NO> :设置匿名用户登陆是否询问密码
ascii_download_enable=<YES/NO>
ascii_upload_enable=<YES/NO> :一般为NO,启动这个可能会导致DoS的攻击
hide_ids=<YES/NO> :如果启动,所有档案拥有者与组群都为FTP,也是就ls -l之类指令看到的拥有者和组均为FTP
ls_recurse_enable=<YES/NO> :启动此功能,则允许登录者使用ls -R这个指令,默认为NO
tcp_wrappers=<YES/NO> :设置服务器是否支持tcp_wrappers(就是支持/etc/hosts.allow和/etc/hosts.deny这两个文件)
pam_service_name=vsftpd :设置PAM模块的名称
xferlog_enable=<YES/NO> :是否启动FTP日志记录
xferlog_file=/var/log/vsftpd.log :设置日志记录文件的名称
xferlog_std_format=<YES/NO> :当设置为YES时,将使用与wu-ftpd相同的日志记录格式
问题篇-------------------------------
1.匿名用户问题
下面说下匿名用户上传的问题
要使匿名用户可以上传,需要激活两个选项,
1.anon_upload_enable=YES
2.anon_mkdir_write_enable=YES
然后打开写权限:write_enable=YES
同时还要anon_world_readable_only=NO ,开放匿名用户对整个服务器的浏览权限。
需要注意的是匿名用户对文件权限而言,属于其他用户,所以一定要把允许匿名用户上传目录的权限修改为其他用户可写,如果配置anon_root=/home/ftp ( 匿名的根目录为/home/ftp)
那么/home/ftp的其他用户权限就不能有写权限,如果根目录所有者是ftp的话,所有者的权限也不能有w,否则出同样的错误
可以在建立个文件/home/ftp/public目录,打开public其他用户的写权限,就可以个public上传了(匿名用户根目录是不可以有写权限的),如果只让下载,就可以再建立目录
/home/ftp/down 然后设置其他用户没有写权限就可以了
需要注意的是anon_other_write_enable这个参数,YES会开放文件更名,删除文件等权限,官方是不建议开启的,但关闭会无法进行续传,
这就需要管理员作出权衡了
(这里解释下续传的问题,就我自己的理解续传是指:在已经上传的文件目录中继续添加文件或目录
如果继续使用默认的022文件掩码,就会产生不能续传问题,因为022不允许写入,
当然你可以打开anon_other_write_enable来解决,不过就会产生混乱,安全问题
这时候文件掩码就很重要了,下边会介绍到文件掩码,你可以根据自己的环境设置
)
2.文件掩码问题
在配置文件中有umask=xxx的参数,这个参数挺让新手费解的,其实它的意思简单
:建立的文件不能拥有的权限
相信大家都见过,sudo chmod 777 /xxx/xxx
其实umask的数值和那个777是一样的系统,8进值表示的权限
第一个是目录所有者权限,第二个是组的权限,第三个是其他用户权限。
有关umask的有这几个参数:
local_umask,anon_umask.
分别代表本地用户,和匿名用户的文件掩码。
可以根据不同需要设置用户创建文件的权限。
umask还是比较重要的,设置好的话,可以很省事,而且安全
下边是关于8近制权限的列表:
0:没有权限
1:允许执行
2:允许写入
3:允许执行和写入
4:允许读取
5:允许执行和读取
6:允许写入和读取
7:允许执行,写入和读取
3.虚拟用户问题
首先要了解,虚拟用户和本地用户是不可以同时存在的
关于虚拟用户的设置论坛里有很多,我只实验了一种可以完整配置成功
特别提醒,必须把local_enable=YES打开才能允许虚拟用户登录
这里要说的是关于虚拟用户权限的问题
虚拟用户本质上是本地用户的一个影射,默认的文件掩码是077,这是有原因的
对与虚拟用户这个团体来说用到的权限只跟文件的所有者的权限有关,就是第一组的rwx
虚拟用户要访问另一个虚拟用户的文件,除了需要可以浏览到对方文件外,就需要相应的权限了
能看到文件,就需要有r权限
如果要进入目录,就需要x权限
要想写入目录,就需要w权限
另外提下,在每个虚拟用户各自的配置文件中,更改anon_umask可以改变每个用户上传的文件掩码,但必须在主配置文件中注释掉local_umask。
4.本地用户的访问控制
论坛的置顶贴中有一个简单的ftp,是一个本地用户的配置,实际中可能不只需要一个
这里就说下本地用户的访问控制,基本有两种方法
都是通过修改主配置文件:
1:指定的本地用户不能访问,其他可以访问
userlist_enable=YES
userlist_deny=YES
userlist_file=/etc/vsftpd.user_list (这个文件需要自己建立,并添加不能访问的用户名)
2:指定的本地用户可以访问,其他不可以(这个比较常用)
userlist_enable=YES
userlist_deny=NO
userlist_file=/etc/vsftpd.user_list(同上,添加可以访问的用户名)
关于chroot的配置1:如果想把所有用户都限制在主目录内活动可以使用下边配置
chroot_local_user=YES
chroot_list_enable=YES(这行可以没有, 也可以有)
chroot_list_file=/etc/vsftpd.chroot_list
那么, 凡是加在文件vsftpd.chroot_list中的用户都是不受限止的用户
即, 可以浏览其主目录的上级目录.
2: 如果不希望某用户能够浏览其主目录上级目录中的内容,可以如上设置, 然后在
文件vsftpd.chroot_list中不添加该用户即可(此时, 在该文件中的用户都是可以浏览其主目录之外的目录的).
或者, 设置如下
chroot_local_user=NO
chroot_list_enable=YES(这行必须要有, 否则文件vsftpd.chroot_list不会起作用)
chroot_list_file=/etc/vsftpd.chroot_list
然后把所有不希望有这种浏览其主目录之上的各目录权限的用户添加到文件vsftpd.chroot_list(此时, 在该文件中的用户都是不可以浏览其主目录之外的目录的)
最后要说下tcp_wrappers参数,这个参数是为独立启动vsftpd提供基于主机的访问控制的配置,可以限制特定主机访问,又可以对不同主机或
网络实施不同的配置(可以理解为不同的待遇)
tcp_wrappers使用/etc/hosts.allow和/etc/hosts.deny两个配置文件实现访问控制,hosts.allow是一个许可表,hosts.deny是一个拒绝表
在hosts.allow中也可以使用DENY,所以通常可以只使用hosts.allow来实现访问控制。
对vsftpd而言,书写hosts.allow有三种语法形式
1: vsftpd:主机表 (设置允许访问的主机表)
2: vsftpd:主机表:DENY (设置拒绝访问的主机表)
3: vsftpd:主机表:setenv VSFTPD_LOAD_CONF 配置文件名 (对指定的主机使用另外的配置)
setenv VSFTPD_LOAD_CONF的值为指定的配置文件名,意图是让vsftpd守护进程读取新的配置项来覆盖主配置文件中的项,实现特定待遇
这有一个小例子来说明tcp_wrappers
功能:
》1.拒绝192.168.2.0/24访问
》2.对192.168.1.0/24内的所有主机不作连接限制和最大传输速率限制
》3.对其他主机的访问限制为:每ip连接数为1,最大传输速率为10kb/s (在主配置文件中设置就好了)
首先保证设定tcp_wrappers=YES
然后编辑 sudo vi /etc/hosts.allow 输入
vsftpd:192.168.2.0/24: DENY (阻止192.168.2.0子网的访问)
vsftpd:192.168.1.0/24 (允许192.168.1.0子网的访问)
vsftpd:192.168.1.0/24: setenv VSFTPD_LOAD_CONF /etc/xxx.conf (对192.168.1.0/24指定专有配置文件xxx.conf,xxx可以自己指定文件名,需要建立)
然后建立xxx.conf文件,并编辑 (建立文件可以用sudo touch /etc/xxx.conf建立)
local_max_rate=0
anon_max_rate=0
max_per_ip=0
!
Read more...
Ubuntu下安装FTP服务-VSFTPD
安装命令:
apt-get install vsftpd
环境:Ubuntu 10.04 vsftpd_2.2.2-3ubuntu6.3_i386.deb
开启关闭服务的命令:
sudo /etc/init.d/vsftpd start
sudo /etc/init.d/vsftpd stop
查看ftp的根目录可以用这个命令 finger ftp
重启ftp:sudo /etc/init.d/vsftpd restart
查看vsftpd是否启动了可以用 pgrep vsftpd 或者列出所有进程 ps -d
配置:
/etc/vsftpd.conf
local_root=<file> :设置本地用户登陆后的目录,默认为本地用户的主目录
local_enable=<YES/NO> :设置是否支持本地用户帐号访问
/etc/ftpusers文件
该文件内的用户一律禁止ftp连接,默认列表包括了root, daemon, nobody等。需要禁止某个用户,添加进来便是。
在这里我的配置,允许本地用户访问,root默认禁止登陆,我把root去掉了。ftp不会长时间开,端口也关掉。
local_root=/data #设置修改默认路径,默认为用户根目录。
这里有个问题,文件权限
上传是需要有写权限的,系统写权限大于配置文件的写权限,给文件夹设置你那个用户可写后,在配置文件中在允许写就可以了
chmod 777 /data
chroot_local_user=<YES/NO> :当为YES时,所有本地用户可以执行chroot,控制用户访问上级目录。
Read more...
ubuntu 10.04挂载新硬盘,分区
先简略记载步骤:
用fdisk –l命令查看
fdisk /dev/xvdb #进行磁盘分区;
command(M for help):n#新建分区
p#主分区
1#/dev/xvdb1
1#开始硬盘柱面
1000#结束硬盘柱面
command(M for help):w#保存退出
mkfs.ext4 -E lazy_itable_init=1 /dev/xvb1 #将 xvdb1 分区格式化为 ext4 文件系统;
mkdir /data #创建目录;
echo "/dev/xvdb1 /data ext4 defaults,noatime,nodiratime 0 0 " >> /etc/fstab #修改系统配置文件;
mount -a #挂载磁盘 ;
------------------------------------------------------
第一次挂载新硬盘分区,虽然错了可以重来,但还是非常谨慎。查了资料,记录:
df -h #查看硬盘分区空间的使用情况。
分区时的命令:
Command (m for help):
这里按m获得帮助
a toggle a bootable flag 将分区设置为启动区
b edit bsd disklabel 编辑bsd的disklabel
c toggle the dos compatibility flag 设置该分区为dos分区
d delete a partition 删除分区
l list known partition types 列出已知的分区类型
m print this menu 打印帮助列表
n add a new partition 创建新分区
o create a new empty DOS partition table
p print the partition table查看分区信息
q quit without saving changes 退出不保存
s create a new empty Sun disklabel
t change a partition's system id改变分区类型
u change display/entry units
v verify the partition table
w write table to disk and exit 保存退出
x extra functionality (experts only)
/etc/fstab 文件的配置内容很多 ,在百度文库找到资料下载。搜索了个别参数的意义:(摘)
在 Linux 下面挂载文件系统的时候,加上 noatime 参数能大幅提高文件系统性能。不知道这个结论来自哪里,其实不需要像设置 noatime 那样设置 nodiratime,最可靠的资料应该是源代码,VPSee 查了一下源代码,发现在内核源代码 linux-2.6.33/fs/inode.c 文件里有一个 touch_atime 函数,可以看出如果 inode 的标记位是 NOATIME 的话就直接返回了,根本就走不到 NODIRATIME 那里去,所以只设置 noatime 就可以了,不必再设置 nodiratime.
void touch_atime(struct vfsmount *mnt, struct dentry *dentry)
1405{
1406 struct inode *inode = dentry->d_inode;
1407 struct timespec now;
1408
1409 if (inode->i_flags & S_NOATIME)
1410 return;
1411 if (IS_NOATIME(inode))
1412 return;
1413 if ((inode->i_sb->s_flags & MS_NODIRATIME) && S_ISDIR(inode->i_mode))
1414 return;
1415
1416 if (mnt->mnt_flags & MNT_NOATIME)
1417 return;
1418 if ((mnt->mnt_flags & MNT_NODIRATIME) && S_ISDIR(inode->i_mode))
1419 return;
...
1435}
Read more...
django apache配置小记
没有认真读 apache 官方文档,先自己研究了一下。windows下修改httpd.conf可以用了,做笔记。
添加代码:
Read more...
LoadModule python_module modules/mod_python.so <Location "/"> SetHandler python-program PythonPath "sys.path+['D:/django']" PythonHandler django.core.handlers.modpython SetEnv DJANGO_SETTINGS_MODULE plant.settings PythonInterpreter plant PythonDebug On </Location>
<Location "/media/"> SetHandler none </Location>
修改代码: DocumentRoot "D:/django/plant" 静态文件路径。 不知道配置是否有问题 ,先做一个小搭建个环境做测试。 看官方文档后再修改。C学习笔记1
#include
/* 用于将输入复制到输出的程序;第2个版本 */
main ( )
{
int c;
while ( (c = getchar ( ) ) != EOF )
putchar ( c );
}
g e t c h a r函数在没有输入时返回一个特殊值,这个特殊值不能与任何实际字符相混淆。这个值叫做E O F(End Of File,文件结束) 。必须把c说明成一个大到足以存放g e t c h a r函数可能返回的各种值的类型。之所以不把c说明成c h a r类型,是因为c必须大到除了能存储任何可能的字符外还要能存储文件结束符E O F。因此,把c说明成i n t类型的。
VC6.0打印输出EOF值发现是-1
漫谈C语言及如何学习C语言 sunxiunan.com
云风最近写了一篇博客《C语言的前世今生》。作为长期使用C语言开发网络游戏服务器的程序员,云风是有理由写这样一篇文字,不过还是感觉谈的不够深入,C语言在业界使用的现状没有怎么描写,有些意犹未尽。在这里想比较系统的谈谈个人对C语言学习方式方法的理解。分别按照书籍、实验环境搭建、网络资源来分别介绍,希望能写的比较完整全面一些,给想学习C语言的朋友一个有价值的参考。
为什么要学习C语言?
为什么要学习、使用C语言?为什么要学习一个可能比自己都岁数大的编程语言?
我在前面如何学习编程语言的博客文章http://sunxiunan.com/?p=1597 里提到,选择一门编程语言,“为什么而学”这个目的是最重要的,目的不明确就没法学好。这也是为什么很多学生朋友在大学里必修C语言却觉得没学明白的原因。因为学习的目的不明确,学习当然也没有动力。还有一个原因是C语言是工程实践性很强的语言,它不是来自某个研究所某个大学学院,而是实实在在从项目需要中产生,伴随着Unix的兴起而流行,语义简明清晰,功能强大而不臃肿,简洁而又不过分简单,实在是居家旅行工作学习必备之良友。
C语言相比C++的优点之一就是最小惊讶原则,一是一二是二,不会在私底下产生一些莫名其妙的额外产物。用C++做个例子,比如这样一个函数原型void PassWithClassValue(COneClass clsParam1),稍微了解C++的朋友都会知道,如果你没有实现COneClass的拷贝构造函数,编译器会好心的帮你实现一个,而且在调用这个函数PassWithClassValue的时候,偷偷地调用拷贝构造函数产生一个临时对象作为参数传递,对于某些情况,比如编写操作系统这类必须优化性能的情景下,这些自以为是的东西是非常邪恶的事情。
C语言本身只提供必要的语言特性,其它复杂一点功能如文件处理、数学计算等等都以库函数方式提供,甚至连malloc、free这种“必须有”的功能,也是以标准库函数的方式提供,而不是作为C语言核心出现。在伟大的著名的无所不包的《K&R》开头部分就提到了,for其实可以通过while来完成,只不过for可以写的更简洁,言外之意,对于C语言for其实不是必要的。跑题一点说,在其它程序语言中Lua可以说继承了C语言简洁的设计哲学,甚至连continue这种几乎必备的关键字都一直拒绝加入,在Lua的maillist以及wiki里都提到过continue这个问题,Lua语言维护者认为continue对于Lua而言不是必要的,也不考虑在后续版本中添加这个关键字。这种简洁哲学也让C语言的可移植性、便携性特别优秀,也使得很多嵌入式系统依然使用C语言作为主要编程工作语言。
Java语言有一个口号:“一次编写,处处运行”,就是跨平台这个噱头。实际上C语言从早期开始就几乎达到了“一次编写,处处编译”,在ANSI在1989年统一了C语言标准以后(称之为C89),只要特定平台上的编译器完整实现了C89标准,而且你的代码没有使用某些特殊的扩展(GCC以及微软都有自己的编译器特定扩展),那么代码一定可以编译通过,再实现一下操作系统相关的函数库,C语言的移植就是很简单的事情。可以用Lua作为例子,Lua本身是完全遵循C89标准,没有使用任何特定扩展,这也保证了有C语言编译器的平台,都可以编译使用Lua。可以编译运行C语言的硬件平台可以从A排到Z,真是非常有意思的事情。
C语言也是一个比较少见的应用领域极为广泛的语言。比如编写操作系统这种高难问题,只有C++、汇编语言可以做到。C语言可以编写服务器端软件如Apache、Nginx,或者编写GUI程序,如GTK。大多数程序语言的第一版是通过C语言实现,借助前面提到的“一次编写处处编译”,最大的保证了这些程序语言的可移植性。在Web开发领域,C语言的应用相对较少,这也是一种取舍的结果,Web开发需要使用PHP、Ruby、Python这样的动态语言,可以快速上线快速修改,可以最大程度满足用户时时变化的需求,这也是C语言的弱项。如果把程序语言的应用领域从硬件到管理软件、Web程序做一个很粗略从下到上的排列,C语言适合领域是比较底层靠近硬件的部分,而新兴语言比较偏重于高层管理或者Web开发这种相对贴近最终用户的领域。比较流行的混合开发模式是使用C语言编写底层高性能部分代码或后台服务器代码,而使用动态语言如Python做前端开发,充分发挥它们各自的优势力量。
提到C语言的缺点,常常是它缺少这种或者那种特性,比如有人建议加入GC,有人建议加入并行或者并发支持,有人提到没有一个比较完整的类似C++的异常策略。这些特性有的可以通过引入第三方库来实现,但C语言的设计哲学其实决定了它不会像C++那样“非常强大”。即使引入了某些人期望的特性,依然会是某些人喜欢某些人不喜欢的情形,现在的功能对于C语言应用领域来说已经够用,其它特性可以通过特定程序语言实现,并且通过C API与C语言编写的程序进行交互。任何一个工匠都不可能只使用一个工具完成他的工作,不同工具结合起来才能更快更好的完成任务。
提到C API,也稍微介绍一下,我们知道windows操作系统的api也好,Linux的系统api也好,或者是想给Ruby、Python编写扩展模块,C语言形式的函数定义都是唯一的选择。C语言就好像是一个中间层或者是胶水,如果想把不同编程语言实现的功能模块混合使用,C语言是最佳的选择。
提了这么多关于C语言的好处,那么学习C语言是否适合就看你自己的判断了,例如要进行一个嵌入式项目,或者需要进行服务器端开发,或者写一个性能相关的组件等等,C语言都是比较好用的选择。另外也可以在C++的使用过程中有意的使用C语言的思考方式,汲取C语言简洁明快清晰地设计思路,对编程设计水平会有很大的提高。
C语言学习方法
在前面http://sunxiunan.com/?p=1597 曾经提到过一个比较系统学习一门新的编程语言的方式,C语言学习也可以按照类似的顺序:阅读参考书,阅读代码,编写调试实际程序,上网参与讨论,研究高级话题。
学习语言的开始一般是阅读参考书。我建议选择几本非常经典的好书,仔细完整反复阅读几遍,“书读百遍其义自现”。选择C语言学习的好处是,这几本书基本上完整涵盖了C语言编程领域的方方面面,不会像C++那样,即使读完一堆书还是有些糊涂,依然有这样那样难懂的陷阱。
1,参考书籍
在豆瓣上列了一个书单,大家可以直接参考http://book.douban.com/doulist/636329/
在下面简单点评一下,阅读顺序最好参照列出的顺序。
《The C Programming Language》http://book.douban.com/subject/1230004/
如果你只想买一本书学习C语言,只需要买这一本就够了。如果你经费足够,建议你多买几本,办公室、家里都放上一本,随手都可以翻翻。用三个词语来形容它就是:经典!经典!经典!这本薄薄的只有二百多页的小书涵盖了C语言的方方面面,前无古人而且后无来者,任何溢美之词都不足以形容它。
《The C Programming Language》(后面称为 K&R)里面包含了一个简单的语法解析器,包含了malloc如何实现,包含了一个完整的操作系统目录浏览程序,这些程序的实用性极高,可以这样说,如果学习任何一门语言能够自己独立动手实现以上的功能,基本上就可以算是入门了。K&R书里面每段都蕴含着非常值得探究的软件开发工程实践经验,如果没有一定的开发经验,其实是看不出来这些冰山下面的内容的,比如开头一章就提出用写完整代码这种方式来教学,而在书中那些C语言的陷阱或者可能出问题的地方,都有提到,但是由于篇幅所限,写的非常简约,很难让人一下就看懂。我正在完整的逐字逐句的阅读此书,希望能稍作注解,写几篇博客分享一下。
《C程序设计语言(第2版·新版)》http://book.douban.com/subject/1139336/
这是K&R的中文译本,可以先从中文译本看起,然后再读一遍英文原版,既可以学习英文,又可以体会原文那种简约优美的风格。
《C陷阱与缺陷》http://book.douban.com/subject/2778632/
《C专家编程》http://book.douban.com/subject/2377310/
这两本书也是学习及使用C语言的朋友必备的两本书,比如《C专家编程》,专门用两三个章节详细介绍C语言中数组与指针的不同之处,这两本书在某种程度上算是对K&R略过的地方做了详细补充,强烈推荐。
《C语言参考手册》http://book.douban.com/subject/2132084/
这是最后一本强烈推荐你最好买回家作为案头书必备的参考书。前面几本书或者稍显简略,或者专注某个特定专题,都不适合遇到问题时翻查。这本《C语言参考手册》可以看作是C语言编程的《新华字典》,全面而权威。里面还涵盖了C99的内容,紧跟时代潮流。
下面几本书都可以作为交叉参考,也都很有价值,也是建议大家都买下来,好书如朋友,日久弥新,像是我推荐的这几本书在douban或者amazon上评分都非常高,而且反复再版。
《C和指针》http://book.douban.com/subject/1229973/
指针的重要性如何,学过C语言(或者C++)的朋友都知道,这本书更是把指针拔高到了与C语言平起平坐的地位,其实也是从头开始介绍,作为教学参考书也是可以的。
《C标准库》http://book.douban.com/subject/3775842/
这本书是专门介绍C语言的标准库如何实现的,比如malloc算法,用标准的C语言该如何写?strlen这个函数应该如何实现?尽管书中不少代码与真实的C标准库相差很多(由于标准库需要考虑性能优化,很多函数有一些特定的trick),但是绝对值得参考。
《你必须知道的495个C语言问题》 http://book.douban.com/subject/3422332/
这本书其实就是C-FAQ的印刷版本,C-FAQ在各种编程语言的FAQ中可以称得上质量一流。如果你想应聘或者招聘C语言相关程序员,这本书一定要参考。
《Linux C编程一站式学习》http://book.douban.com/subject/4141733/
这本书是基于特定操作系统Linux来介绍C语言编程,可作为计算机相关专业的教科书或入门参考书,也是书单里面唯一一本国人原创的编程书籍,非常难得。书中几乎所有内容都在网上直接公开,针对读者的意见进行修改,这也是非常难得的一种开放态度。非常推荐大家买一本。
学习C语言,一定不能只读书,应该动手练习完成书里面的项目需求(比如编写一个目录浏览器)以及每章的练习题目。这就需要有可以实验的环境,下面针对不同操作系统简单做一下介绍。
2,动手实验环境搭建
也没有调查过,不知道现在学校里学习C语言是不是依然跟着谭浩强老师用TurboC2.0编程,如果还是这个组合的话,那就太差劲了,赶快抛开它们。
下面主要介绍不同操作系统平台下的集成编程环境,基于初学者以及我个人喜好,就不推荐大家命令行下用vim编程了,直接上IDE。
Windows系统下推荐大家使用Code::blocks这个软件。这个软件最大优点是自带了基于mingw的GCC以及GDB,只要下载70M左右软件包,就可以完整支持C++、C语言编程了。各种功能(比如调试功能)也很强大,版本更新也比较快。注意下载选择名字有mingw的文件,比如最新版本是codeblocks-10.05mingw-setup.exe(版本也许有所不同)。
主页:http://www.codeblocks.org/
如果需要做Windows操作系统的开发,可以下载Visual C++ 2010 Express。
因为Code::Blocks不包含Windows编程头文件(实际是因为没有Windows SDK),无法编写Windows操作系统相关的界面应用程序或者服务类程序。而VC++Express自带了这些头文件以及编程库,虽然功能稍微简陋,但对于练习使用基本够用。
主页:http://www.microsoft.com/express/windows/
对于计算机专业的学生朋友,建议大家使用Linux操作系统,或者更详细一点是使用Xubuntu操作系统作为桌面,使用Netbeans和GCC这个组合(当然也可以选择Code::Blocks)。在Xubuntu下可以通过apt-get install build-essential这个命令安装gcc相关程序,已经可以在Terminal下编译C语言程序了,但为了使用方便,大家可以选择Netbeans的C++支持包,在Netbeans网站上就能下载。
主页:http://netbeans.org/features/cpp/index.html
如果使用苹果Mac系统,毫无疑问XCode就是编程的绝佳选择,XCode可以在苹果开发者网站上免费下载,在IPhone SDK中也包含了XCode。
主页:http://developer.apple.com/technologies/tools/xcode.html
如果手头没有合适的编程环境,还需要实验一些简单的代码,可以用http://codepad.org/ 提供的服务,在线编写运行代码。
另外建议大家申请一个github.com的账号,在gist.github.com可以保存自己的练习代码,就不需要随身带着U盘了。
3,网络资源
如果想用十分钟时间了解一下C语言的来龙去脉、前世今生,维基百科这个页面http://en.wikipedia.org/wiki/C_%28programming_language%29 是最佳选择。
从维基百科可以看到,C语言1972年由Dennis Ritchie设计的命令式、结构化范式编程语言。类型为静态的弱类型,需要显式定义。最新国际标准为C99。设计上主要受到了B、ALGOL68、汇编语言、PL/I、FORTRAN的影响,C语言也影响了大量编程语言,如C++、Objective-C、C#、Java、Go、PHP、Python等等(个人觉得受C影响很大的是PHP,基本上有C编程基础的程序员,很容易就能上手PHP了,除了PHP的OO部分)。
在维基百科条目中有很大篇幅介绍了作者认为C语言缺失的特性,比如面向对象、多线程、GC、异常处理等等,当然这有些吹毛求疵,如果需要这些特性,完全可以用其它程序语言。另外一个介绍的重点是“未定义行为”,有些我们认为理所当然的结果,其实在C语言标准中并没有明确定义,假定这些行为应该如何,当程序使用另外的编译器或者不同版本编译器编译运行,都可能有bug产生。
接下来维基百科条目谈到了C语言的用处,必须承认尽管现在编程语言成百上千,能称之为“系统级”的少之又少,新兴语言中只有Go还能称得上。现在大规模软件项目中完全选用C语言可能性不大,但是核心部分完全可以用C搭建,相对C++开发工具的高昂价格,C语言相关的免费辅助开发软件非常丰富,比如splint,valgrind,不少核心库经过长期使用也都非常稳定。
由于C语言广泛支持各种平台以及编译器相对成熟可靠,不少编程语言选择C语言作为一个中间层,比如Glasgow Haskell编译器就是这样做的。
另一个可以找到大量C语言编程相关资料的地方是“美味书签”,通过搜索特定关键字 (C + programming)就可以找到很多值得挖掘的资源http://delicious.com/search?p=c+programming
还可以参考dmoz.org的C语言分类http://www.dmoz.org/Computers/Programming/Languages/C/ 相比美味书签时效性能差点,但是分类比较系统,查找也要容易一些。
程序员往往是懒惰的,“拿来主义”、“拷贝主义”很流行也很有效,当对某个函数或者关键字不是很理解的时候,看看别人是怎么使用的,会非常有启发性。这里介绍几个常用的代码搜索网站,最常用的是google的codesearch:http://codesearch.google.com ,可以通过不同条件及正则表达式搜索特定关键词。另外可以参考维基百科上一个“带有C语言示例的文章”分类,里面代码写的也很不错。还可以在github.com上搜索相关项目。在前面博客文章我还介绍了一个名为罗塞塔代码的网站http://rosettacode.org/ 这个网站上可以找到不同程序语言针对某个问题的解决方案,用于学习比较非常便利。
学习编程也需要大量阅读名家经典代码,与学中文英文需要大量阅读名著一个道理,C语言编程优质项目那是“彩旗飘舞,人山人海”,个人建议可以看看Lua、Sqlite、Nginx这些项目的代码,代码量不多,而且代码质量也都比较高。另外可以看看Linux内核代码,坊间有不少书籍可以帮助解读。关于如何很好的阅读代码,大家可以参考《Code Reading》这本书。
书看了几本,代码写了一些,也略微读了读其他人的代码,就应该用C语言来完成真实工作中碰到的问题,让C语言真正成为你的瑞士军刀。只有当你经常使用C语言来进行编程工作,经常思考如何通过C设计一个优雅高效的系统,才能更深刻的理解C语言设计哲学。
还可以到http://stackoverflow.com 参与回答问题,浏览其他人的问题解答来汲取知识,比如这篇http://stackoverflow.com/questions/2054939/char-is-signed-or-unsigned-by-default 就介绍了一个C语言关于char类型的小陷阱。
C语言学习当中,有一些难点需要多加注意,如pointer与array的不同之处,复杂类型定义如何解读,如何正确使用预处理preprocessor以及宏定义。其实这些内容在前面书籍都是反复提到,如果按部就班学习下来,应该不成问题。
当C语言学习的差不多时候,还可以学习一门动态语言,比如Lua或者Python,试着在实际工作项目中混合使用动态语言与C语言,一加一发挥出来的力量不仅仅是二,而是非常二(说笑一下,哈哈)。
还有什么问题,欢迎留言。
附录
一些有用的C语言网络资源:
C语言标准化组织ISO JTC1/SC22/WG14的主页,在这里可以找到ISO C的文档:http://www.open-std.org/jtc1/sc22/wg14/
《The Development of the C Language》作者Dennis Ritchie,极为经典的论文。 http://cm.bell-labs.com/cm/cs/who/dmr/chist.html
“C语言全景”这个网站内容很全面:http://www.softpanorama.org/Lang/c.shtml
Dan Saks在embedded.com上的专栏Programming Pointer ,里面文章很有深度,值得一读。
http://www.lysator.liu.se/c/c-www.html 这也是一个C语言资源汇总页面。
http://www.ioccc.org/index.html 混乱C语言代码大赛,很著名。
http://en.wikipedia.org/wiki/Underhanded_C_Contest 另外一个C语言编程大赛,主要面向黑客。
comp.lang.c以及c.moderated这两个讨论组推荐订阅,相当于互联网最大的C相关编程问题论坛:
http://groups.google.com/group/comp.lang.c
http://groups.google.com/group/comp.lang.c.moderated
这里对C语言的各种bit操作做了收集整理,不少题目在面试时候经常出现。http://graphics.stanford.edu/~seander/bithacks.html
台湾的惯C达人Jserv博客,建议大家订阅:http://blog.linux.org.tw/~jserv/
一些值得关注及研究的C语言相关项目:
TinyCC,被很多项目用作动态编译C语言的编译器引擎:http://bellard.org/tcc/
GCC的标准库实现:http://en.wikipedia.org/wiki/GNU_C_Library
Glib是GTK的底层辅助编程库,与C标准库是不一样的,在C语言上实现了面向对象机制:http://en.wikipedia.org/wiki/GLib
dietlibc在前面博客文章介绍过,C标准库的另一种实现:http://www.fefe.de/dietlibc/
一些C语言编程时可以使用的工具软件,帮你提高代码质量:
http://www.splint.org/
http://valgrind.org/
http://www.dwheeler.com/flawfinder/
PMD可用于检测重复代码 http://pmd.sourceforge.net/cpd.html
llvm的静态分析项目 http://clang-analyzer.llvm.org/
C语言编程规范编程标准:
http://en.wikipedia.org/wiki/MISRA_C
http://www.eecs.harvard.edu/~ellard/CS50-96/programming-style.html
http://developers.sun.com/solaris/articles/secure.html
cert这个文档国内有中文翻译版本:https://www.securecoding.cert.org/confluence/display/seccode/CERT+C+Secure+Coding+Standard
http://www.cs.utah.edu/dept/old/texinfo/standards/standards_toc.html
C语言编程电子书及教程:
http://publications.gbdirect.co.uk/c_book/ 这一本写的非常详细,你可以把它看成是类似谭浩强版的教科书。
http://www.knosof.co.uk/cbook/cbook.html 这一本云风曾经推荐过,相当深入的介绍了C99标准,深入细节时候需要读读。
http://www.duckware.com/bugfreec/index.html 这本书在网上流传一个中文版本,《编写优化、高效、无错地代码》,另外也有英文影印版《编程精粹》。
http://wangcong.org/blog/?page_id=196 作者王聪,也是相当hard geek,从两个样章看,包含了相当多的内容。
《C语言深度解剖》这本可以在百度文库或google搜到,可以读读,有些参考性。
《C标准和实现》作者姚新颜,他的《深度探索C、C++》算是当年比较有深度的书籍,可惜已经绝版了。这本书也可以在百度文库搜到。这本书也比较值得读。
良葛格C语言学习笔记 http://caterpillar.onlyfun.net/Gossip/CGossip/CGossip.html
C与C++的兼容性问题 http://en.wikipedia.org/wiki/Compatibility_of_C_and_C%2B%2B
另一个文档关于C与C++标准兼容性问题:http://david.tribble.com/text/cdiffs.htm
《C Elements of Style》http://www.oualline.com/books.free/style/index.html
《Linux安全编程》http://www.dwheeler.com/secure-programs/
《C Craft》电子版 http://crypto.stanford.edu/~blynn/c/
《The function pointer tutorials》函数指针教程。http://www.newty.de/fpt/index.html
C语言编程及Unix系统调用,想用C在Unix或者Linux编程的朋友可以参考。http://www.cs.cf.ac.uk/Dave/C/
优化C、C++代码 http://www.eventhelix.com/RealtimeMantra/Basics/OptimizingCAndCPPCode.htm
图文并茂介绍C语言的指针 http://boredzo.org/pointers/
另外一篇介绍C语言优化的文章 http://www.prism.uvsq.fr/~cedb/local_copies/lee.html
一个C语言教学ppt http://www.slideshare.net/petdance/just-enough-c-for-open-source-programmers
一些Unix下C语言编程相关的文章 http://users.actcom.co.il/~choo/lupg/tutorials/index.html
Unix下如何建立静态、动态C语言函数库 http://users.actcom.co.il/~choo/lupg/tutorials/libraries/unix-c-libraries.html
如何使用GDB http://users.actcom.co.il/~choo/lupg/tutorials/debugging/debugging-with-gdb.html
一些C语言编程技巧 http://users.bestweb.net/~ctips/
Advanced C programming,高级C语言编程,可以提高水平,非常有帮助 http://www.mpi-inf.mpg.de/departments/rg1/teaching/advancedc-ws08/literature.html
C语言问答,这些题目也可用于面试 http://www.gowrikumar.com/c/
Read more...
python正则表达式初使用
想要实现post提交一个表单,直接urllib.urlencode,不知道为什么不行。采用直接提交的方式发现行得通,但是问题来了,其中一个表单时类似学号一样的8位数字,需要修改。正好用到正则表达式。
Read more...
post_data = ""
strRe = r"[0-9]{8}"
reObj = re.compile(strRe)
print reObj.findall(post_data)
实现查找,有一个方法可以直接替换,更方便:
repl = "XXXXXXXX"
print reObj.sub(repl, post_data)
开始听到群里说正则表达式很难,但通过学习发现,处理个小问题还是很简单的。很方便。
在线网站检测工具
以后会用到,检查html语法等还是不错的
1. HTML Validator
http://validator.w3.org/
网页结构检测工具,支持HTML, XHTML, SMIL, MathML…….
2. CSS Validator
http://jigsaw.w3.org/css-validator/
CSS验证。
3. Links Validator
http://validator.w3.org/checklink
检测HTML/XHTML文档中的死链接 。
4. RSS Feed Validator
http://validator.w3.org/feed/
W3C的免费Feed验证服务。
5. Free Site Validator
http://freesitevalidator.com/
全面检测你网站的各种验证问题和坏链接,并且提供详细的检测报告。
可访问性检测工具
6. WebAIM Wave
http://wave.webaim.org/
Wave是我最喜欢的可访问性检测服务,非常有效率。
7. Functional Accessibility Evaluator
http://fae.cita.uiuc.edu/
这个工具用来评估你网站功能的可访问性。
8. Hera
http://www.sidar.org/hera/
HERA (WCAG 1.0)标准来检测。
跨浏览器检测工具
9. Xenocode
http://www.xenocode.com/Browsers/
你可以用Xenocode来运行任何浏览器,包括 IE6, IE7 和IE8 。
10. Browsershots
http://browsershots.org/
一个非常不错的检测网站在各种浏览器和大多数操作系统上的兼容性。
11. IeTester
http://www.my-debugbar.com/wiki/IETester/
IE浏览器集合,这个大家都知道。
12. Microsoft Expression SuperPreview
http://www.microsoft.com/expression/
可以同时查看比对网站在IE不同浏览器下的效果。
网站性能检测工具
13. Pingdom Tools
http://tools.pingdom.com
分析网站的加载速度,单独显示每个元素加载的进度。、
14. YSlow
http://developer.yahoo.com/yslow/
Firefox插件,网站性能检测和优化工具。
15. Web Page Analyzer
http://www.websiteoptimization.com/services/analyze/
一个简便的检测工具,可以帮你生成一份你网站性能的检测报告。
Read more...
django学习笔记-django.contrib.auth.views.password_change修改密码
利用auth.views.password_change修改密码:
urls.py
urlpatterns = patterns('',
url(r'passwdchange/$','django.contrib.auth.views.password_change',{'template_name':'users/passwdchange.html','post_change_redirect':'password_changed'}),
)
post_change_redirect :密码修改后,URL重定向到 password_changed
开始没有写这个,只写了template_name。报错:
Reverse for 'django.contrib.auth.views.password_change_done' with arguments '()' and keyword arguments '{}' not found.
看官网post_change_redirect 可以不写。
https://docs.djangoproject.com/en/1.3/topics/auth/#django.contrib.auth.views.password_change
找了几个网站,看后面都跟有,而且名字不同。纳闷了
Read more...
正则表达式-收集常用
学习链接:http://0x55aa.sinaapp.com/%e7%ae%97%e6%b3%95-%e7%bc%96%e7%a8%8b/211.html
http://0x55aa.sinaapp.com/%e7%ae%97%e6%b3%95-%e7%bc%96%e7%a8%8b/212.html
匹配中文,英文字母和数字及_:^[\u4e00-\u9fa5_a-zA-Z0-9]+$
同时判断输入长度:[\u4e00-\u9fa5_a-zA-Z0-9_]{4,10}
^[\w\u4E00-\u9FA5\uF900-\uFA2D]*$
1、一个正则表达式,只含有汉字、数字、字母、下划线不能以下划线开头和结尾:
^(?!_)(?!.*?_$)[a-zA-Z0-9_\u4e00-\u9fa5]+$ 其中:
^ 与字符串开始的地方匹配
(?!_) 不能以_开头
(?!.*?_$) 不能以_结尾
[a-zA-Z0-9_\u4e00-\u9fa5]+ 至少一个汉字、数字、字母、下划线
$ 与字符串结束的地方匹配
放在程序里前面加@,否则需要\\进行转义 @"^(?!_)(?!.*?_$)[a-zA-Z0-9_\u4e00-\u9fa5]+$"
(或者:@"^(?!_)\w*(?<!_)$" 或者 @" ^[\u4E00-\u9FA50-9a-zA-Z_]+$ " )
2、只含有汉字、数字、字母、下划线,下划线位置不限: ^[a-zA-Z0-9_\u4e00-\u9fa5]+$
3、由数字、26个英文字母或者下划线组成的字符串 ^\w+$
4、2~4个汉字 @"^[\u4E00-\u9FA5]{2,4}$";
匹配中文字符的正则表达式: [u4e00-u9fa5]
评注:匹配中文还真是个头疼的事,有了这个表达式就好办了
匹配双字节字符(包括汉字在内):[^x00-xff]
评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)
匹配空白行的正则表达式:ns*r
评注:可以用来删除空白行
匹配HTML标记的正则表达式:< (S*?)[^>]*>.*?|< .*? />
评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力
匹配首尾空白字符的正则表达式:^s*|s*$
评注:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式
匹配Email地址的正则表达式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*
评注:表单验证时很实用
匹配网址URL的正则表达式:[a-zA-z]+://[^s]*
评注:网上流传的版本功能很有限,上面这个基本可以满足需求
匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
评注:表单验证时很实用
匹配国内电话号码:d{3}-d{8}|d{4}-d{7}
评注:匹配形式如 0511-4405222 或 021-87888822
匹配腾讯QQ号:[1-9][0-9]{4,}
评注:腾讯QQ号从10000开始
匹配中国邮政编码:[1-9]d{5}(?!d)
评注:中国邮政编码为6位数字
匹配身份证:d{15}|d{18}
评注:中国的身份证为15位或18位
匹配ip地址:d+.d+.d+.d+
评注:提取ip地址时有用
匹配特定数字:
^[1-9]d*$ //匹配正整数
^-[1-9]d*$ //匹配负整数
^-?[1-9]d*$ //匹配整数
^[1-9]d*|0$ //匹配非负整数(正整数 + 0)
^-[1-9]d*|0$ //匹配非正整数(负整数 + 0)
^[1-9]d*.d*|0.d*[1-9]d*$ //匹配正浮点数
^-([1-9]d*.d*|0.d*[1-9]d*)$ //匹配负浮点数
^-?([1-9]d*.d*|0.d*[1-9]d*|0?.0+|0)$ //匹配浮点数
^[1-9]d*.d*|0.d*[1-9]d*|0?.0+|0$ //匹配非负浮点数(正浮点数 + 0)
^(-([1-9]d*.d*|0.d*[1-9]d*))|0?.0+|0$ //匹配非正浮点数(负浮点数 + 0)
评注:处理大量数据时有用,具体应用时注意修正
匹配特定字符串:
^[A-Za-z]+$ //匹配由26个英文字母组成的字符串
^[A-Z]+$ //匹配由26个英文字母的大写组成的字符串
^[a-z]+$ //匹配由26个英文字母的小写组成的字符串
^[A-Za-z0-9]+$ //匹配由数字和26个英文字母组成的字符串
^w+$ //匹配由数字、26个英文字母或者下划线组成的字符串
在使用RegularExpressionValidator验证控件时的验证功能及其验证表达式介绍如下:
只能输入数字:“^[0-9]*$”
只能输入n位的数字:“^d{n}$”
只能输入至少n位数字:“^d{n,}$”
只能输入m-n位的数字:“^d{m,n}$”
只能输入零和非零开头的数字:“^(0|[1-9][0-9]*)$”
只能输入有两位小数的正实数:“^[0-9]+(.[0-9]{2})?$”
只能输入有1-3位小数的正实数:“^[0-9]+(.[0-9]{1,3})?$”
只能输入非零的正整数:“^+?[1-9][0-9]*$”
只能输入非零的负整数:“^-[1-9][0-9]*$”
只能输入长度为3的字符:“^.{3}$”
只能输入由26个英文字母组成的字符串:“^[A-Za-z]+$”
只能输入由26个大写英文字母组成的字符串:“^[A-Z]+$”
只能输入由26个小写英文字母组成的字符串:“^[a-z]+$”
只能输入由数字和26个英文字母组成的字符串:“^[A-Za-z0-9]+$”
只能输入由数字、26个英文字母或者下划线组成的字符串:“^w+$”
验证用户密码:“^[a-zA-Z]w{5,17}$”正确格式为:以字母开头,长度在6-18之间,
只能包含字符、数字和下划线。
验证是否含有^%&’,;=?$”等字符:“[^%&',;=?$x22]+”
只能输入汉字:“^[u4e00-u9fa5],{0,}$”
验证Email地址:“^w+[-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*$”
验证InternetURL:“^http://([w-]+.)+[w-]+(/[w-./?%&=]*)?$”
验证电话号码:“^((d{3,4})|d{3,4}-)?d{7,8}$”
正确格式为:“XXXX-XXXXXXX”,“XXXX-XXXXXXXX”,“XXX-XXXXXXX”,
“XXX-XXXXXXXX”,“XXXXXXX”,“XXXXXXXX”。
验证身份证号(15位或18位数字):“^d{15}|d{}18$”
验证一年的12个月:“^(0?[1-9]|1[0-2])$”正确格式为:“01”-“09”和“1”“12”
验证一个月的31天:“^((0?[1-9])|((1|2)[0-9])|30|31)$”
正确格式为:“01”“09”和“1”“31”。
匹配中文字符的正则表达式: [u4e00-u9fa5]
匹配双字节字符(包括汉字在内):[^x00-xff]
匹配空行的正则表达式:n[s| ]*r
匹配HTML标记的正则表达式:/< (.*)>.*|< (.*) />/
匹配首尾空格的正则表达式:(^s*)|(s*$)
匹配Email地址的正则表达式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*
匹配网址URL的正则表达式:http://([w-]+.)+[w-]+(/[w- ./?%&=]*)?
Read more...