首页 | 资讯动态 | linux基础 | 系统管理 | 网络管理 | 编程开发 | linux数据库 | 服务器技术 | linux相关 | linux认证 | 嵌入式 | 下载中心 | 专题 | linux招聘 | 镜像站
OKLinux中文技术站
·设为首页
·加入收藏
·联系我们
系统管理: 中文环境 系统管理 桌面应用 内核技术 | Linux基础: 基础入门 安装配置 常用命令 经验技巧 软件应用 | Linux数据库: Mysql Postgre Oracle DB2 Sybase other
网络管理: 网络安全 网络应用 Linux服务器 环境配置 黑客安全 | 编程开发: PHP CC++ Python Perl Shell 嵌入式开发 java jsp | PHP技术: PHP基础 PHP技巧 PHP应用 PHP文摘
Linux资讯 Linux招聘 Linux专题 Apache | Linux相关: 硬件相关 Linux解决方案 Linux认证 企业应用 其它Unix | 相关下载: 资料下载 参考手册 开发工具 服务器类 软路由 其它
 技术搜索:
会员中心 注册会员 高级搜索  
  → 当前位置:首页>编程开发>php>php应用>正文

PHP和正则表达式(2)

http://www.oklinux.cn  2007-02-09  来源: oklinux收集整理   会员收藏  游客收藏  【 】 

  一或多次重复字符

  为了告诉正则表达式引擎一个字符必须存在,也可以重复不止一次,我们用+字符,像

  <?php echo ereg("z+", "i like the zoo"); ?>

  下面的例子也会返回true:

  <?php echo ereg("z+", "i like the zzzzzzoo!"); ?>

  零或一次重复字符

  我们也可以告诉正则表达式引擎,一个字符必须是或者只存在一次,或者没有。我们用?字符来做这项工作,就像

  <?php echo ereg("c?", "cats are fuzzy"); ?>

  如果我们愿意,我们完全可以从上面的搜索字符串中删除’c’,这个表达式会仍旧返回true.’?’ 的意思是一个’c’可以出现在搜索字符串的任何地方,但不是必须的。

  正则表达式语法 (续)

  空格字符

  为了匹配一个搜索字符串中的空格字符,我们用预定义Posix的类,[[:space]].方括号标明连续字符的相关性,”:space:”是实际要匹配的类(在这种情形下,是任何空白字符)。空白包括tab字符,新行字符,空白字符。或者,如果搜索字符串必须包含只有一个空格,而不是一个tab或者新行字符,你可以用一个空格字符(" ")。在大多数情况下,我倾向于使用":space:",因为这意味着我的意图不仅仅是单个空格字符,这点很容易被忽视。这里有一些Posix-标准预定义类,

  有一些我们可以作为正则表达式的部分的一些Posix-标准预定义类,包括[:alnum:], [:digit:], [:lower:]等等。 完整的列表可以在这里查看

  我们可以像这样匹配单个空白字符:

  <?php echo ereg("Mitchell[[:space:]]Harper", "Mitchell Harper"); ?>

  我们也可以通过在表达式后用?字符来告诉正则表达式引擎匹配没有空白或者一个空白。

  <?php echo ereg("Mitchell[[:space:]]?Harper", "MitchellHarper"); ?>

  模式分组

  相关的模式可以在方括号里分在一起。很容易用[a-z]和[A-Z]指定只有一个小写字母或者一列大写字母以搜索字符串的一部分存在。

  <?php
// 要求从第一个到最后一个都是小写字母
echo ereg("^[a-z]+$", "johndoe"); // 返回true
?>

  或者像

  <?php
// 要求从第一个到最后一个都是大写字母
ereg("^[A-Z]+$", "JOHNDOE"); // 返回 true?
?>

  我们也可以告诉正则表达式引擎,我们希望或者是小写字母,或者是大写字母。我们只要把[a-z]和[A-Z]模式结合在一起就可以做到。

  <?php echo ereg("^[a-zA-Z]+$", "JohnDoe"); ?>

  在上面的例子里,如果我们能匹配"John Doe",而不是"JohnDoe",将是非常有意义的。我们用下面的正则表达式来做这个:

  ^[a-zA-Z]+[[:space:]]{1}[a-zA-Z]+$

  很容易搜索一个数字字符串

  <?php echo ereg("^[0-9]+$", "12345"); ?>

  词语分组

  不仅仅搜索模式可以分组,我们也可以用圆括号把相关的搜索词语进行分组。

  <?php echo ereg("^(John|Jane).+$", "John Doe"); ?>

  在上面的例子中,我们有一个字符串头部字符,紧跟着"John"或者"Jane",至少有一个其它字符,然后一个字符串尾部字符。所以…

  <?php echo ereg("^(John|Jane).+$", "Jane Doe"); ?>

  ...将也匹配我们的搜索模式

  特殊字符的情形

  因为一些字符要用在一个搜索模式的明确分组或者语法上,像在(John|Jane)中的圆括号,我们需要告诉正则表达式引擎来屏蔽这些字符,加工它们使之成为被搜索字符串的一部分,而不是搜索表达式的一部分。我们所用的方法称为“字符转义”,涉及到将任何“专用符号”加上反斜杠。所以,例如,如果我想在我的搜索中包含’|’,那么我就可以这样做

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

  这里只是少量的一些你要转义的字符,你必须转义^, $, (, ), ., [, |, *, ?, +, and { 。

  希望你现在对正则表达式实际上有多么强大有了一点点感觉了。现在让我们看两个用正则表达式来检查数据中一个字符串的例子。

  正则表达式例子

  例子1

  让我们把第一个例子做的相当简单,检验一个标准的URL.一个标准的URL(没有端口号),有三个部分构成:

  [协议]://[域名]

  让我们从匹配URL的协议部分开始,并且让它只能用http或者ftp.我们可以用下面的正则表达式做到这点:

  ^(http|ftp)

  ^字符特指字符串的头部,利用圆括号把http和ftp围住,且用“或者”符号(|)将它们分开,我们告诉正则表达式引擎http和ftp两者之一必须在字符串的开头。

  一个域名通常由www.somesite.com构成,但是可以随意选择要不要www部分。为了例子简单,我们只允许.com,.net,和.org的域名是在考虑之中的。我们最好这样对正则表达式中的域名部分表示如下:

  (www.)?.+.(com|net|org)$

  把所有的东西放在一起,我们的正则表达式就可以用作检查一个域名,如:

  <?php
function isValidDomain($domainName)
{
return ereg("^(http|ftp)://(www.)?.+.(com|net|org)$", $domainName);
}
//真(true)
echo isValidDomain("http://www.somesite.com");
//真(true)
echo isValidDomain("ftp://somesite.com");
//假 (false)
echo isValidDomain("ftp://www.somesite.fr");
//假 (false)
echo isValidDomain("www.somesite.com");
?>

  例子二

  因为我居住在澳大利亚悉尼,让我们检查一个典型的澳大利亚国际电话号码。澳大利亚国际电话号码的格式如下:

  +61x xxxx-xxxx

  第一个x是区号,其它的都是电话号码。检查以'+61'开头且紧跟一个在2到9之间的区号的电话号码,我们用下面的正则表达式:

  ^+61[2-9][[:space:]]

  注意,上面的搜索模式把'+'字符用''转义,以便于可以在搜索中包含,不至于被解释为一个正则表达式。[2-9]告诉正则表达式引擎我们需要包含一个2到9之间的数字。[[:space:]]类则告诉正则表达式期望在这里有一个空白。

  这里是电话号码剩下的搜索模式:

  [0-9]{4}-[0-9]{4}$

  这里没有什么不寻常的地方,我们只是告诉正则表达式引擎电话号码可用的数字,它必须是4个数字的组合,跟着一个连接符,再跟着另一个4个数字的组合,然后一个字符串尾部字符。

  把完整的正则表达式放在一起,放进一个函数,我们可以用代码来检查一些澳大利亚国际电话号码:

  <?php
function isValidPhone($phoneNum)
{
echo ereg("^+61[2-9][[:space:]][0-9]{4}-[0-9]{4}$", $phoneNum);
}
// 真(true)
echo isValidPhone("+619 0000-0000");
// 假(false)
echo isValidPhone("+61 00000000");
//假( false)
echo isValidPhone("+611 00000000");
?>

  总结

  正则表达式用一些不适合书写和重复的代码来检查一个字符串。在最后的几页里,我们已经讲解了所有的Posix标准正则表达式的基础,包括字符,分组和PHP ereg函数。我们也知道了怎么用正则表达式来检查一些PHP中简单的字符串。




上一篇:PHP新手上路(6)   下一篇:在一个字符串中查找另一个字符串


收藏于收藏夹】 【评论】 【推荐】 【打印】 【关闭
相关文档
·在一个字符串中查找另一个字符串
·用PHP开发C/S结构
·彻底解决refer编码问题
·php中的exec函数并不想我想像的那样
·用PHP将mysql数据表转换为excel文件格式
·用 PHP 编程语言开发动态 WAP 页面
·如何用正则表达式来表示中文
·PHP中上传大体积文件时需要的设置
·用php实现生成Excel文件范例(1):客户端
·PHP 程序加速探索
·Redhat中快速安装php/mysql
·PHP5 的异常处理机制(1)
·正则表达式中的特殊字符
·在PHP中使用与Perl兼容的正则表达式
·用 PHP 实现通过 Web 执行 C/C++ 程序
·SSI使用详解(2)
发表评论
密码: 匿名评论
评论内容:

(不超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规)
 
  最新文档
·Linux系统上把PHP编译进Apache静态内核
·关于PHP逗点连接符与引号问题
·php有关于正则表达式的详细说明
·通过gd库为图片添加透明水印
·第二节--PHP5 的对象模型
·用php对文件上传处理过程的进一步说明
·PHP分页显示制作详细讲解
·Linux主机重编译PHP支持GD库
·php+ImageMagick+imagick API 配置指南
·php抓取和分析
·第一节--面向对象编程
·php的预定义变量
  阅读排行
·Linux系统上把PHP编译进Apache静态内核
·WASP使用方法简介(3)
·Linux主机重编译PHP支持GD库
·Linux编程之提升PHP执行速度全攻略分析
·Windows服务器安装多套PHP的解决方案
·MySQL (C API)VC实例及代码下载 (1)
·用PHP编程语言开发动态WAP页面
·FleaPHP -- 中国人自己的PHP开发框架
·如何使用动态共享对象的模式来安装PHP
·PHP应用分页显示制作详细讲解
·用php或js获取图片大小,高宽尺寸
·为什么PHP令人不爽(对于大型系统)
·PHP也可以当成Shell Script使用
·教您如何应用PHP开发出安全的应用程序
·winbinder开发php桌面程序
网摘收藏: