MongoDB入门简介|MongoDB下载安装|MongoDB语法

第1章    MongoDB简介

1.1    功能特点

    官方网址:http://www.mongodb.org/

    MongoDB是一个基于分布式文件存储的数据库开源项目。由C++语言编写,旨在为WEB应用提供可护展的高性能数据存储解决方案。
    它的特点是可扩展,高性能,易使用,模式自由,存储数据非常方便等,主要功能特性有:
    面向文档存储:(类JSON数据模式简单而强大)。
    高效的传统存储方式:支持二进制数据及大型对象(如照片和视频)。
    复制及自动故障转移:Mongo数据库支持服务器之间的数据复制,支持主-从模式及服务器之间的相互复制。
    Auto-Sharding自动分片支持云级扩展性(处于早期alpha阶段):自动分片功能支持水平的数据库集群,可动态添加额外的机器。
    动态查询:它支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。
    全索引支持:包括文档内嵌对象及数组。Mongo的查询优化器会分析查询表达式,并生成一个高效的查询计划。
    支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。

1.2    适用范围

适用场景:
    适合实时的插入,更新与查询,并具备应用程序实时数据存储所需的复制及高度伸缩性。
    适合作为信息基础设施的持久化缓存层。
    适合由数十或数百台服务器组成的数据库。因为Mongo已经包含对MapReduce引擎的内置支持。
    Mongo的BSON数据格式非常适合文档化格式的存储及查询。

不适用场景:
    高度事务性的系统。
    传统的商业智能应用。
    级为复杂的SQL查询。
 

第2章MongoDB下载及安装

2.1    下载地址

http://www.mongodb.org/downloads
选择一个最新稳定的版本v1.6.5,如下图:

2.2    安装方法
通过mongod –install命令把mongodb注册成为window service。

1)    创建数据库存储目录;例如:d:\data\db

2)    通过命令行执行:
    mongod --bind_ip 127.0.0.1 --logpath d:\data\logs --logappend --dbpath d:\data\db
--directoryperdb –install

【注:将mongodb安装成服务,装该服务绑定到IP127.0.0.1,日志文件为d:\data\logs,以及添加方式记录。数据目录为d:\data\db。并且每个数据库将储存在一个单独的目录(--directoryperdb)】

3)    启动服务后
,尝试是否可用,通过命令行进入%MONGODB_HOME%\bin下执行mongo.exe命令后出现如下图所示信息表示连接成功:
 

第3章    MongoDB语法

3.1    基本命令
3.1.1.    启动mongodb
run 直接启动:
例如:mongod run
 
--dbpath 指定存储目录启动:
例如:mongod –dbpath = d:\ db
 
--port 指定端口启动:(默认端口是:27017)
例如:mongod --port 12345。
3.1.2.    停止mongodb
在窗口模式中,可以直接使用Ctrl+C停止服务。

3.2    SQL语法
3.2.1.    基本操作
db.AddUser(username,password)  添加用户
db.auth(usrename,password)     设置数据库连接验证
db.cloneDataBase(fromhost)     从目标服务器克隆一个数据库
db.commandHelp(name)           returns the help for the command
db.copyDatabase(fromdb,todb,fromhost)  复制数据库fromdb---源数据库名称,todb---目标数据库名称,fromhost---源数据库服务器地址
db.createCollection(name,{size:3333,capped:333,max:88888})  创建一个数据集,相当于一个表
db.currentOp()                 取消当前库的当前操作
db.dropDataBase()              删除当前数据库
db.eval(func,args)             run code server-side
db.getCollection(cname)        取得一个数据集合,同用法:db['cname'] or
db.getCollenctionNames()       取得所有数据集合的名称列表
db.getLastError()              返回最后一个错误的提示消息
db.getLastErrorObj()           返回最后一个错误的对象
db.getMongo()                  取得当前服务器的连接对象get the server
db.getMondo().setSlaveOk()     allow this connection to read from then nonmaster membr of a replica pair
db.getName()                   返回当操作数据库的名称
db.getPrevError()              返回上一个错误对象
db.getProfilingLevel()         
db.getReplicationInfo()        获得重复的数据
db.getSisterDB(name)           get the db at the same server as this onew
db.killOp()                    停止(杀死)在当前库的当前操作
db.printCollectionStats()      返回当前库的数据集状态
db.printReplicationInfo()
db.printSlaveReplicationInfo()
db.printShardingStatus()       返回当前数据库是否为共享数据库
db.removeUser(username)        删除用户
db.repairDatabase()            修复当前数据库
db.resetError()                
db.runCommand(cmdObj)          run a database command. if cmdObj is a string, turns it into {cmdObj:1}
db.setProfilingLevel(level)    0=off,1=slow,2=all
db.shutdownServer()            关闭当前服务程序
db.version()                   返回当前程序的版本信息

3.2.2.    数据集(表)操作
db.test.find({id:10})          返回test数据集ID=10的数据集
db.test.find({id:10}).count()  返回test数据集ID=10的数据总数
db.test.find({id:10}).limit(2) 返回test数据集ID=10的数据集从第二条开始的数据集
db.test.find({id:10}).skip(8)  返回test数据集ID=10的数据集从0到第八条的数据集
db.test.find({id:10}).limit(2).skip(8)  返回test数据集ID=1=的数据集从第二条到第八条的数据
db.test.find({id:10}).sort()   返回test数据集ID=10的排序数据集
db.test.findOne([query])       返回符合条件的一条数据
db.test.getDB()                返回此数据集所属的数据库名称
db.test.getIndexes()           返回些数据集的索引信息
db.test.group({key:...,initial:...,reduce:...[,cond:...]})
db.test.mapReduce(mayFunction,reduceFunction,<optional params>)
db.test.remove(query)                      在数据集中删除一条数据
db.test.renameCollection(newName)          重命名些数据集名称
db.test.save(obj)                          往数据集中插入一条数据
db.test.stats()                            返回此数据集的状态
db.test.storageSize()                      返回此数据集的存储大小
db.test.totalIndexSize()                   返回此数据集的索引文件大小
db.test.totalSize()                        返回些数据集的总大小
db.test.update(query,object[,upsert_bool]) 在此数据集中更新一条数据
db.test.validate()                         验证此数据集
db.test.getShardVersion()                  返回数据集共享版本号

3.3.  MongoDB语法与现有关系型数据库SQL语法比较
MongoDB语法                                   MySql语法
db.test.find({'name':'foobar'}) <==> select * from test where name='foobar'
db.test.find()                  <==> select * from test
db.test.find({'ID':10}).count() <==> select count(*) from test where ID=10
db.test.find().skip(10).limit(20)     <==> select * from test limit 10,20
db.test.find({'ID':{$in:[25,35,45]}}) <==> select * from test where ID in (25,35,45)
db.test.find().sort({'ID':-1})        <==> select * from test order by ID desc
db.test.distinct('name',{'ID':{$lt:20}})  <==> select distinct(name) from test where ID<20
db.test.group({key:{'name':true},cond:{'name':'foo'},reduce:function(obj,prev){prev.msum+=obj.marks;},initial:{msum:0}})  <==> select name,sum(marks) from test group by name
db.test.find('this.ID<20',{name:1})  <==> select name from test where ID<20
db.test.insert({'name':'foobar','age':25})<==>insert into test ('name','age') values('foobar',25)
db.test.remove({})                <==> delete * from test
db.test.remove({'age':20})        <==> delete test where age=20
db.test.remove({'age':{$lt:20}})  <==> elete test where age<20
db.test.remove({'age':{$lte:20}}) <==> delete test where age<=20
db.test.remove({'age':{$gt:20}})  <==> delete test where age>20
db.test.remove({'age':{$gte:20}}) <==> delete test where age>=20
db.test.remove({'age':{$ne:20}})  <==> delete test where age!=20
db.test.update({'name':'foobar'},{$set:{'age':36}}) <==> update test set age=36 where name='foobar'
db.test.update({'name':'foobar'},{$inc:{'age':3}})  <==> update test set age=age+3 where name='foobar'

正向预搜索和反向预搜索的学习

在看正则的时候中碰到一个这样的正则问题.
将 一句SQL语句中的“select”和“from” 之间的字符替换为 “count(*)”
问题很简单,我的答案是

代 码:
<?php
$sql = "select uid,sas,fd from asdf";
echo preg_replace("/select(.+?)from/i",'select count(*) from',$sql);
?>


但是看了别人的答案却十分的简单

代码:
echo preg_replace("/(?<=select).+?(?=from)/i",' count(*) ',$sql);


其中的?<=让我很不解.从资料上查得到:

代码:
(?<=select).+?(?=from)表示的是匹配从select开始到from结束中间的数据.



正向预搜索:"(?=xxxxx)","(?!xxxxx)"
反向预搜索:"(?<=xxxxx)","(?<!xxxxx)"
正向预搜索:"(?=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个数字。

常用正则表达式

 

元字符及其在正则表达式上下文中的行为: 

 

\ 将下一个字符标记为一个特殊字符、或一个原义字符、或一个后向引用、或一个八进制转义符。

 

^ 匹配输入字符串的开始位置。如果设置了 RegExp 对象的Multiline 属性,^ 也匹配 ’\n’ 或 ’\r’ 之后的位置。 

 

$ 匹配输入字符串的结束位置。如果设置了 RegExp 对象的Multiline 属性,$ 也匹配 ’\n’ 或 ’\r’ 之前的位置。 

 

* 匹配前面的子表达式零次或多次。 

 

+ 匹配前面的子表达式一次或多次。+ 等价于 {1,}。 

 

? 匹配前面的子表达式零次或一次。? 等价于 {0,1}。 

 

{n} n 是一个非负整数,匹配确定的n 次。

 

{n,} n 是一个非负整数,至少匹配n 次。 

 

{n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。在逗号和两个数之间不能有空格。

 

? 当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。 

 

. 匹配除 "\n" 之外的任何单个字符。要匹配包括 ’\n’ 在内的任何字符,请使用象 ’[.\n]’ 的模式。 

(pattern) 匹配pattern 并获取这一匹配。 

 

(?:pattern) 匹配pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。 

 

(?=pattern) 正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。 

 

(?!pattern) 负向预查,与(?=pattern)作用相反 

 

x|y 匹配 x 或 y。 

 

[xyz] 字符集合。 

 

[^xyz] 负值字符集合。 

 

[a-z] 字符范围,匹配指定范围内的任意字符。 

 

[^a-z] 负值字符范围,匹配任何不在指定范围内的任意字符。 

 

\b 匹配一个单词边界,也就是指单词和空格间的位置。

 

\B 匹配非单词边界。 

 

\cx 匹配由x指明的控制字符。 

 

\d 匹配一个数字字符。等价于 [0-9]。 

 

\D 匹配一个非数字字符。等价于 [^0-9]。 

 

\f 匹配一个换页符。等价于 \x0c 和 \cL。 

 

\n 匹配一个换行符。等价于 \x0a 和 \cJ。 

 

\r 匹配一个回车符。等价于 \x0d 和 \cM。 

 

\s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于[ \f\n\r\t\v]。 

 

\S 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。 

 

\t 匹配一个制表符。等价于 \x09 和 \cI。 

 

\v 匹配一个垂直制表符。等价于 \x0b 和 \cK。 

 

\w 匹配包括下划线的任何单词字符。等价于’[A-Za-z0-9_]’。 

 

\W 匹配任何非单词字符。等价于 ’[^A-Za-z0-9_]’。 

 

\xn 匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。

 

\num 匹配 num,其中num是一个正整数。对所获取的匹配的引用。 

 

\n 标识一个八进制转义值或一个后向引用。如果 \n 之前至少 n 个获取的子表达式,则 n 为后向引用。否则,如果 n 为八进制数字 (0-7),则 n 为一个八进制转义值。 

 

\nm 标识一个八进制转义值或一个后向引用。如果 \nm 之前至少有is preceded by at least nm 个获取得子表达式,则 nm 为后向引用。如果 \nm 之前至少有 n 个获取,则 n 为一个后跟文字 m 的后向引用。如果前面的条件都不满足,若 n 和 m 均为八进制数字 (0-7),则 \nm 将匹配八进制转义值 nm。 

 

\nml 如果 n 为八进制数字 (0-3),且 m 和 l 均为八进制数字 (0-7),则匹配八进制转义值 nml。 

 

\un 匹配 n,其中 n 是一个用四个十六进制数字表示的Unicode字符。

 

匹配中文字符的正则表达式: [\u4e00-\u9fa5]
评注:匹配中文还真是个头疼的事,有了这个表达式就好办了

匹配双字节字符(包括汉字在内):[^\x00-\xff]
评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)

匹配空白行的正则表达式:\n\s*\r
评注:可以用来删除空白行

匹配HTML标记的正则表达式:<(\S*?)[^>]*>.*?</\1>|<.*? />
评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力

匹配首尾空白字符的正则表达式:^\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个英文字母或者下划线组成的字符串

php正则表达式

1 理解正则表达式


正则表达式是一种可以用于模式匹配的强大工具。简单地说,正则表达式就是一套规则,用于判定其他的元素是否符合它。


举一个简单的例子:在一个用户注册的页面中(例如,一个论坛或者交友网站的注册页面),上面可能有“电子邮件”这一项需要填写。对系统来说,需要判定用户所填写的电子邮件地址是否合法,即是否符合电子邮件地址的规则。利用字符串操作技术可以实现这个功能。


<!--检查电子邮件合法性:validate_email1.php-->
<?php

function validate_email1($email){

    $hasAtSymbol = strpos($email, "@");    //检查是否包含@

    //strpos($mystring,$findme);在$mystring中查找是否存在$findme,有则返回位置,否则返回false;

    $hasDot = strpos($email, ".");         //检查是否包含.

    if($hasAtSymbol && $hasDot && $hasAtSymbol<$hasDot )

        return 1;

    else

        return 0;

}

    echo validate_email1("chen@sjolzy.cn");       //true

    echo validate_email1(chen@sjolzy);             //false

?>

上面代码实现了一个函数validate_email1(),使用字符串操作中的定位字符函数,判断一个字符串是否是一个合法的电子邮件地址的规则。仔细考虑实现的功能,实际上是在判断一个字符串是否具有一定的模式,或者说是否满足一定的规则。在这种情况下,可以使用正则表达式来实现相同的功能。


<!--使用正则表达式检查电子邮件合法性:validate_email2.php-->
<?php

    function validate_email2($email){

        return (int)ereg("^[a-zA-Z]+@[a-zA-Z]+\.[a-zA-Z]+$", $email);

    }

    echo validate_email2(chen@sjolzy.cn);          //true

    echo validate_email2(chen@sjolzy);        //false

?>

上面实现了具有相同功能的函数validate_email1(),函数使用了一个正则表达式的函数ereg() :以区分大小写的方式在 string 中寻找与给定的正则表达式 pattern 所匹配的子串。观察ereg()函数的参数“^[a-zA-Z]+@[a-zA-Z]+\.[a-zA-Z]+$”,容易看出其实际上表示满足这样规则的字符串:以[a-zA-Z]即任意大小写字符串开头,然后紧跟“@”,然后又是任意大小写字母组成的字符串,第4部分是符号“.”,最后仍是任意字符串。这相当于定义了一个字符串的组成规则。


在看过这个示例后,重新来看正则表达式的定义:正则表达式是一种可以用于模式匹配的强大工具。


 2 使用正则表达式


在PHP有6个函数来处理正则表达式,检查一个字符串是否满足一个的规则。它们都把一个正则表达式作为它们的第一个参数,语法如下。


    bool ereg(string pattern, string string [, array regs]):最常用的正则表达式函数, 搜索跟正则表达式pattern匹配的一个字符串。区分大小写。搜索到返回true,否则返回false。
 

     string ereg_replace(string pattern, string replacement, string string):搜索跟正则表达式pattern匹配的一个字符串,并用新的字符串代替所有这个表达式出现的地方。


     bool eregi(string pattern, string string [, array regs]):搜索跟正则表达式pattern匹配的一个字符串。不区分大小写。搜索到返回true,否则返回false。


     string eregi_replace(string pattern, string replacement, string string):和ereg_replace有着一样的搜索-替换功能,不过忽略大小写


     arraysplit(string pattern, string string [, int limit]):搜索和正则表达式匹配的字符串,区分大小写并且以字符串集合的方式返回匹配结果。


     arrayspliti(string pattern, string string [, int limit]):搜索和正则表达式匹配的字符串,不区分大小写,并且以字符串集合的方式返回匹配结果。

    介绍了PHP的正则表达式函数及其功能。要了解它们的具体使用方法,则要首先了解正则表达式的构造。


3 构造正则表达式:


    如前所述,在匹配一个字符串到正则表达式之前,必须先构造正则表达式。

    1).定义头部规则
   SPHP用“^”定义字符串头部的规则,例如:“^hello”即定义头部为“hello”的字符串,结合上一节所介绍的函数,代码<?php echo ereg("^hello", "hello world!"); ?>    //true将返回“true”,因为待验证的字符串“hello word!”满足规则:以“hello”开头。而<?php echo ereg("^hello", "i say hello world"); ?>    //false将返回 false,因为hello不在字符串”I say hello world”的头部。

    2).定义尾部规则
    <?PHP用“$”定义字符串尾的规则,例如:“world$”即定义尾部为“world”的字符串,代码

    <?php echo ereg("world$", "hello world!"); ?>        //true

    将返回“true”,因为待验证的字符串“hello word!”满足规则:以“world”结尾。而

    <?php echo ereg("world$", "i say hello php"); ?>    //false

    将返回 false,因为world不在字符串”I say hello     php”的尾部。

    3).定义包含任意字符规则$ 
    PHP用“.”定义包含任意字符的规则,例如:“.”即定义包含任意字符的字符串,代码

    <?php echo ereg(".", "something"); ?>        //true

    将返回“true”,因为待验证的字符串“something”满足规则:包含任意字符。而

    <?php echo ereg(".", ""); ?>                //false

    将返回 false,因为空串不包含任意字符。

    4).定义包含字符数目规则
    使用大括号“{n}”定义包含n个任意字符,“{m,n}”定义包含m到n范围内的任意字符。

    例如“.{3}”定义包含或超过3个连续任意字符的字符串,“.{1,3}”定义包含1到3个字符的字符串。代码

    <?php echo ereg(".{3}", "abcd"); ?>        //true
    <?php echo ereg(".{1,3}", "aa"); ?>        //true

    都将返回“true”,因为待验证的字符串“aaa”满足规则:包含3个字符。而

    <?php echo ereg(".{4}", "aaa"); ?>        //false

    将返回 false。

    “.”也可以结合“^”和“$”使用,例如“.{3}$”定义了以3个字符结尾的字符串,“^.{3}”定义了以三个连续字符开头的字符串。代码

    <?php echo ereg(".{3}$", "baaa"); ?>        //true

    将返回“true”,因为待验证的字符串“baaa”满足规则:以3个连续字符结尾。而

    <?php echo ereg(".{3}$", "ab"); ?>          //false

    将返回 false。)

    5).定义包含0~n个字符规则
    PHP用“*”定义包含0~n个字符的规则,例如:“a*”即定义包含0~n个字符的字符串,代码

    <?php echo ereg("a*", "aaa"); ?>        //true

    将返回“true”,因为待验证的字符串“aaa”满足规则:包含0~n个字符“a”。而

    <?php echo ereg("a*", "bbb"); ?>        //true

    也将返回 true,因为待验证的字符串“bbb”也满足规则:包含0~n个字符“a”。

    6).定义包含1~n个字符规则
    PHP用“+”定义包含1~n个字符的规则,例如:“a+”即定义包含1~n个字符“a”的字符串,代码

    <?php echo ereg("a+", "aaa"); ?>        //true

    将返回“true”,因为待验证的字符串“aaa”满足规则:包含1~n个字符“a”。而

    <?php echo ereg("a+", "bbb"); ?>        //false

    将返回 false,因为待验证的字符串“bbb”不满足规则:包含1~n个字符“a”。

    *7).定义包含0或1个字符规则
    PHP用“?”定义包含0或1个字符的规则,例如:“a?”即定义包含0或1个字符“a”的字符串,代码

    <?php echo ereg("a?", "a"); ?>        //true
    <?php echo ereg("a?", "bb"); ?>       //true

    将返回“true”,因为待验证的字符串“a”和“bb”都满足规则:包含0或1个字符“a”。而

    <?php echo ereg("a?", "aa"); ?>    //true

   //(有错) 将返回false,因为待验证的字符串“bbb”不满足规则:包含0或1个字符“a”。

    8).定义包含某范围的字符规则
    PHP用方括号“[start-end]”定义包含start-end范围内任意字符的规则,例如:“[a-z]”即定义包含a到z范围内任意字符的字符串,代码

    <?php echo ereg("^[a-z]+$", "abc"); ?>    //true

    将返回“true”,因为待验证的字符串“abc”满足规则:包含1~n个字符a~z范围内任意字符。

    <?php echo ereg("^[a-z]+$", "ABC"); ?>    //false

    将返回 false,因为待验证的字符串“ABC”不满足规则:包含1~n个字符“a”。

    9).定义包含某范围的词规则
    PHP用圆括号“(word1|word2|…)”定义包含word1、word2、…的任意字符串的规则,例如:“(wang|zhang)”即定义包含“wang”或“zhang”的任意字符的字符串,代码

    <?php echo ereg("^(wang|zhang)+$", "wang and zhang"); ?>    //true

    将返回“true”,因为待验证的字符串“wang and zhang”满足规则:以“wang”或“zhang”开头。

    <?php echo ereg("^(wang|zhang)+$", "shi and jing"); ?>        //false

    将返回 false,因为待验证的字符串“shi and jing”不满足规则:以“wang”或“zhang”开头。

    10).空格字符的处理
    空格字符可以简单的处理为普通字符“ ”,但在实际使用中常用“[[:space]]”来代替,这样在字符串中更加易读。例如:“I[[:space]]am”表示为“I am”。

    11).特殊字符的处理
    因为一些字符要用在一个正则表达式语法上,像(wang|zhang)中的圆括号,需要屏蔽掉这些字符,使之成为字符串的一部分,而不是具有功能性的表达式的一部分。用转义字符,即反斜杠“\”可以实现这种转换,例如:

    <?php echo ereg("^[a-zA-z]+\|[a-zA-z]+$", "wang|zhang"); ?>

    在正则表达式中,需要转义的字符包括:^, $, (, ), ., [, |, *, ?, +, \ and {。

    本节全面的介绍了如何构造一个正则表达式,即如何定义一个字符串组成规则。下一节,将给出一系列例子,通过例子,将进一步熟悉上述规则构造方法。

4 示例1验证


    本小节实现利用PHP正则表达式验证URL合法性的示例。一个合法的URL如:

    <a href="//sjolzy.cn" target="_blank">sjolzy.cn</a>

    其构造规则为:[协议]://[www].[域名].[com|net|org…]

    根据上一小节的构造正则表达式,可以构造下面的规则。

    "^http://(www\ .)?.+\ .(com|net|org)$"    

    其中,"^http://”定义能匹配规则的字符串开头是"http://";"(www\ .)?"表示随后应该是0-1个“www”;而“.+”表示任意字符串;然后是一个“.”,转义字符“\”表明其仅仅是一个字符;最后的“(com|net|org)$”表明以com、net、org中其中一个结尾,此处,只列出这3种情况。完成验证URL合法性的函数如下所示。

    <!--使用正则表达式检查URL合法性:validate_url.php-->

    <?php

        function isValidDomain($domainName)

        {

            return(int)ereg("^(http|ftp)://(www\.)?.+\.(com|net|org)$",$domainName);

        }

        echo isValidDomain(http://www.sjolzy.cn);    //1

        echo isValidDomain("//sjolzy.com");    //1

        echo isValidDomain("http://www.sjolzy.fr");    //0

        echo isValidDomain("www.sjolzy.com");    //0

    ?>

5 示例2验证电话号码

    本小节实现利用PHP正则表达式验证北京市电话号码合法性的的示例。合法的号码如:+86 010xxxxxxxx,其构造规则为:[+86] [010][八位数字]。

    根据上一小节的构造正则表达式,可以构造下面的规则。

    “^\+86[[:space:]]010[0-9]{8}$

    其中,“^\+86”定义能匹配规则的字符串开头是“+86”;“[[:space:]]”表示随后1个空格;而“[0-9]{8}$”表明以8个数字结尾。
    完成验证北京市电话号码合法性的函数如下所示。

    <!--使用正则表达式检查北京电话号码合法性:validate_phone.php-->

    <?php

        function isValidPhone($phoneNum)

        {

            echo (int)ereg("^\+86[[:space:]]010[0-9]{8}$", $phoneNum);

        }

        echo isValidPhone("+86 01012345678");          //1

        echo isValidPhone("+86 010123456789");        //0

        echo isValidPhone("+86 0101234567a");          //0

    ?>