ImageVerifierCode 换一换
格式:DOCX , 页数:14 ,大小:24.73KB ,
资源ID:29059555      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/29059555.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(掌握 PHP 中的正则表达式.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

掌握 PHP 中的正则表达式.docx

1、掌握 PHP 中的正则表达式模式匹配是软件中最常见的内容,因此正则表达式这种特殊的简写方式得到了不断演变,从而实现任务简化。在 “掌握 PHP 中的正则表达式” 系列的第 1 部分中了解如何在代码中使用这种简写方式。所有机器都会消耗输入,执行某种工作,然后生成输出。例如,电话把声能转换为电信号并重新转换回声频来启动对话。发动机吸收燃料(蒸汽、裂变、汽油或者做大量的功)并将其转换为功。又或者将朗姆酒、冰块、酸橙和柑桂酒倒入调酒壶中,并且用力搅拌制作麦泰(或者,如果您希望调制出更具有大都会特色的饮品,请尝试使用一点香槟酒和带果肉的梨汁饮料来享用贝利尼。调酒壶真是一个灵活而又非凡的工具)。由于软件将

2、转换数据,因此每个应用程序也是一台机器 但是是一台 “虚拟” 机器,因为没有使用物理部件。例如,编译器期望获得源代码作为输入并将其转化为适于执行的二进制代码。气象建模工具将根据历史测量数据来生成预报。而图像编辑器将消耗并生成像素,对每个像素或每组像素应用规则从而锐化图像或形成某种风格。就像任何其他机器一样,软件应用程序期望获得某些 “原料”,例如数字列表、XML 模式中封装的数据或者协议。如果给程序提供错误的 “原料” 类型或形式不匹配 则很可能得到无法预测的结果,甚至导致灾难。有句格言说得好,“错误的输入必然导致错误的输出”。事实上,所有比较重要的问题都要求从错误数据中过滤出正确数据和/或拒

3、绝错误数据以防止得到错误输出。对于 PHP Web 应用程序来说也是如此。无论输入是来自手动形式还是来自编程式的 Asynchronous JavaScript + XML (Ajax) 请求,程序都必须在执行任何计算之前检查传入信息。可能要求数值属于某个范围或者被限定为整数。值可能需要匹配一种特定格式,如邮政编码。例如,美国的邮政编码是五位数字加上可选的 “4 个” 限定号码,后者由连字符和四位附加数字组成。其他字符串可能是特定数目的字符,例如两个字母表示的美国各州的缩写。字符串最为棘手:PHP 应用程序必须对嵌入 SQL 查询、JavaScript 代码或者其他能够改变应用程序行为或有碍安

4、全性的恶意操作程序保持警惕。但是程序如何告知输入是数字还是遵循某个约定(例如邮政编码)?基本上,执行匹配需要使用一个小型解析器 创建一个状态机、读取输入、处理标记、监视状态并生成结果。但是,即使是一个简单的解析器,也难于进行创建和维护。幸运的是,由于模式匹配分析是最常见的计算需求,因此,随着时间的推移,一种特殊的简写方式(引擎)应运而生(大约从 UNIX 出现之后),它可以减轻事务的工作量。正则表达式 (regex) 使用简明、易读的符号描述模式。给定一个正则表达式和数据,正则表达式引擎将得到数据是否匹配模式及匹配内容(如果找到匹配)等结果。下面是应用从 UNIX 命令行实用程序 grep 中

5、提取的正则表达式的简单示例,该实用程序将在一个或多个 UNIX 文本文件的内容中搜索指定模式。命令grep -i -E Bat将搜索序列beginning-of-line(用脱字符号 来表示),后面紧接着大写或小写字母b、a和t(使用-i选项将在模式匹配时忽略大小写,举例来说,也就是B和b是等效的)。因此,给出文件 heroes.txt:清单 1. heroes.txt CatwomanBatmanThe TickBlack CatBatgirlDanger GirlWonder WomanLuke CageThe PunisherAnt ManDead GirlAquamanSCUDBlac

6、kboltMartian Manhunter上述 grep 命令将生成两个匹配:BatmanBatgirl正则表达式PHP 将提供两个 regex 编程接口,一个用于可移植操作系统接口(Portable Operating System Interface,POSIX),另一个接口用于 Perl Compatible Regular Expressions (PCRE)。基本上,推荐使用第二个接口,因为 PCRE 比 POSIX 实现更加强大,可以提供能在 Perl 中找到的所有操作符。要了解关于 POSIX regex 函数调用的更多信息,请阅读 PHP 文档(请参阅参考资料)。在这里,我主

7、要介绍 PCRE 功能。PHP PCRE regex 包含针对特定字符和其他操作符、针对特定位置(例如字符串的开头或结尾)或者针对单词的开头或结尾的匹配操作符。regex 还可以描述替代词,即在其他技术中可能描述为 “this” 或 “that” 的单词;定长、变长或不确定长度的副本;字符集(例如,“a到m之间的任意字母”);以及类或各类字符(可打印字符或标点符号)。regex 中的特殊操作符也允许分组 一种将某个操作符应用到所有其他操作符的方法。表 1 显示了一些常用的 regex 操作符。您可以连接和结合表 1 中的基本操作符(以及其他操作符)并进行组合来构建(非常)复杂的 regex。表

8、 1. 常见 regex 操作符操作符用途.(句点)匹配所有单个字符(脱字符号)匹配出现在行或字符串开头的空字符串$(美元符号)匹配出现在行尾的空字符串A匹配大写字母Aa匹配小写字母a/d匹配所有一位数字/D匹配所有单个非数字字符/w匹配所有单个字母或数字字符;同义词是:alnum:A-E匹配所有大写的A、B、C、D或EA-E匹配除大写A、B、C、D或E之外的任何字符X?匹配出现零次或一次的大写字母XX*匹配零个或多个大写字母XX+匹配一个或多个大写字母XXn精确匹配n个大写字母XXn,m至少匹配n个且不多于m个大写字母X;如果忽略m,则表达式将尝试匹配至少n个X(abc|def)+匹配一连串

9、的(最少一个)abc和def;abc和def将匹配下面是 regex 的常见用法示例。假定 Web 站点要求每个用户创建一个登录名。每个用户名至少要包含 3 个但不多于 10 个字母数字字符,并且必须以字母为开头。要强制遵守这些规范,可以使用以下 regex 在提交给应用程序时验证用户名:A-Za-zA-Za-z0-9_2,9$。脱字符号将匹配字符串的开头。第一个集合A-Za-z表示所有字母。第二个集合A-Za-z0-9_2,9表示由至少 2 个至多 9 个任意字母、数字和划线组成的序列。并且使用美元符号 ($) 匹配字符串末尾。乍看之下,美元符号可能看似不必要,但是它是至关重要的。如果忽略掉

10、它,regex 将匹配开头为字母、包含 2 至 9 个字母数字字符以及任意数目的任何其他字符的所有字符串。换言之,没有美元符号锚定字符串的结尾,带有匹配前缀(例如 “martin1234-cruft”)的非常长的字符串将生成误判 (false positive)。回页首用 PHP 和 regex 编程PHP 提供了用于在文本中查找匹配、将每个匹配替换为其他文本(la 搜索和替换)以及在列表的元素之中查找匹配的函数。函数包括: preg_match() preg_match_all() preg_replace() preg_replace_callback() preg_grep() preg

11、_split() preg_last_error() preg_quote()为了演示函数,让我们编写一个小型 PHP 应用程序,该应用程序将搜索单词列表以查找特定模式,遵循这种模式的单词和 regex 都是由传统的 Web 表单来提供的,并且结果都使用simple print_r()函数返回给浏览器。如果需要测试或改进 regex,则这种小型程序非常有用。清单 2 显示了 PHP 代码。所有输入都是通过简单的 HTML 表单来提供的(为了简洁起见,不显示相应的表单,并且已经省略了用于捕捉 PHP 代码错误的代码)。清单 2. 比较文本与模式 $value ) $words $key = tr

12、im( $value ); / / find the words that match the regular expression / $matches = preg_grep( /$_REQUEST regex /, $words ); print_r( $_REQUESTregex ); echo( ); print_r( $words ); echo( ); print_r( $matches ); exit;?首先,使用preg_split()函数把用逗号分隔的单词字符串分隔为单个元素。此函数将在匹配给定 regex 的每个点上划分字符串。在这里,regex 只是,(一个逗号,以逗号

13、分隔的列表中的分隔符)。代码中的首尾斜杠只表示 regex 的开头和结尾。preg_split()的第三个参数和第四个参数都是可选的,但是每个参数都十分有用。给第三个参数提供整数n将只返回前n个匹配;或者提供-1返回所有匹配。如果指定第四个参数,标志PREG_SPLIT_NO_EMPTY、preg_split()将处理所有空结果。接下来,用逗号分隔的单词列表中的每个元素都是通过trim()函数整理的(省略了开始和结束部分的空白),然后与提供的 regex 进行比较。使用函数preg_grep()可以非常轻松地处理列表:只需提供模式作为第一个参数,并提供要匹配的单词数组作为第二个参数。函数将返回

14、匹配数组。例如,如果键入 regexA-Za-zA-Za-z0-9_2,9$作为模式和变长单词列表,则可能获得类似清单 3 的内容。清单 3. 简单 regex 的结果 A-Za-zA-Za-z0-9_2,9$Array ( 0 = martin 1 = 1happy 2 = hermanmunster ) Array ( 0 = martin )顺便说一句,您可以转化preg_grep()操作并查找与具有PREG_GREP_INVERT可选标志的模式(与命令行中的grep -v相同)不匹配的元素。用$matches = preg_grep( /$_REQUEST regex /, $word

15、s, PREG_GREP_INVERT )替换第 22 行并重用清单 3 的输入,生成Array ( 1 = 1happy 2 = hermanmunster )。回页首分解字符串函数preg_split()和preg_grep()是优秀的小函数。如果使用可预测的模式分隔子字符串,则前者可以将字符串分解成几个子字符串。函数preg_grep()还可以快速地过滤列表。但是如果必须使用一个或多个复杂规则分解字符串会发生什么情况?例如,美国的电话号码通常显示为 “(305) 555-1212”、“305-555-1212” 或 “305.555.1212”。如果删除标点符号,所有电话号码都减少到 1

16、0 位,这样在使用 regex/d10时十分易于识别。但是,美国的三位区号和三位电话号码前缀不能以零或一为开头(因为零和一是非本地呼叫的前缀)。regex 不会把数字序列分隔为单个数字并编写复杂的代码,而是会测试其有效性。清单 4 显示了执行此任务的代码片段。清单 4. 确定电话号码是否是有效的美国电话号码 ?php $punctuation = preg_quote( ().- ); $number = preg_replace( /$punctuation/, , $_REQUEST number ); $valid = /2-90-922-90-920-94/; if ( preg_ma

17、tch( $valid, $number ) = 1 ) echo( $_REQUEST number is valid ); exit;?让我们详细查看这段代码: 如表 1所示,regex 使用一小组操作符,例如方括号 ( ),对一个集合命名。如果需要匹配对象文本中的这样一个操作符,则必须用前导反斜杠 (/) 来对 regex 中的操作符进行 “转义”。在转义了操作符后,它将像所有其他文字一样进行匹配。例如,如果需要匹配一个句点字符,比方说,在完全限定主机名中查找句点,则编写/.。您可以随意将字符串传递给preg_quote()来自动转义它找到的所有 regex 操作符,如第 1 行所示。如

18、果在第 1 行后使用echo() $punctuation,则应当会看到/(/)/.-。 第 2 行将删除电话号码中的所有标点符号。preg_replace()函数将把$punctuation中出现的所有某个字符替换为空字符串(因此,使用集合操作符 ),从而有效地省略字符。新字符串将被返回并分配给$number。 第 4 行定义有效的美国电话号码模式。 第 5 行执行匹配,把现在仅含数字的电话号码与模式进行比较。如果有匹配,则函数preg_match()返回 1。如果未找到匹配,则preg_match()返回零。如果在处理过程中出错,则函数将返回 False。因此,要检查是否成功,请查看返回值

19、是否为 1。否则,查看preg_last_error()的结果(如果使用 PHP V5.2.0 或更高版本)。如果不为零,则可能已经超出计算范围,例如超出 regex 可以递归的深度。您可以在 PCRE Regular Expression Functions 页面中查找关于 PHP regex 使用惯例和限制的讨论(请参阅参考资料)。回页首捕捉如果在数据验证中只需要进行 “是否匹配?” 的测试,则有许多实例可用。但是,regex 更常用于检验匹配和提取关于匹配的信息。返回到电话号码示例,如果找到匹配,您可能希望将区号、前缀和行号保存到数据库的独立字段中。Regex 可以记住与capture匹

20、配的内容。capture操作符是一些括号,并且操作符可以出现在 regex 中的任意位置。您还可以对捕捉进行嵌套,以查找较大捕捉的子分段。例如,要捕捉 10 位电话号码中的区号、前缀和行号,您可以使用:/(2-90-92)(2-90-92)(0-94)/如果找到匹配,则把前三个数字捕捉到第一组括号中,把接下来的三个数字捕捉到第二组括号中;并且把最后四个数字捕捉到剩余操作符中。preg_match()调用的变体将检索捕捉。清单 5.preg_match()如何检索捕捉 $valid = /(2-90-92)(2-90-92)(0-94)/; if ( preg_match( $valid, $n

21、umber, $matches ) = 1 ) echo( $_REQUEST number is valid ); echo( Entire match: $matches0 ); echo( Area code: $matches1 ); echo( Prefix: $matches2 ); echo( Number: $matches3 );如果提供一个变量作为preg_match()的第三个参数,例如这里的$matches,则它被设为捕捉结果列表。第 0 个元素(索引编号为0)是整个匹配;第 1 个元素是分别与第一组括号相关联的匹配,以此类推。嵌套捕捉几乎可以捕捉任意深度的分段和子分段

22、。嵌套捕捉的诀窍在于预测每个匹配出现在匹配数组(例如$matches)中的位置。下面是需要遵循的规则:从 regex 的开头开始计算左括号的数目 该计数是匹配数组的索引。清单 6 提供了用于提取街道地址片段(人为设计)的示例。清单 6. 用于提取街道地址的代码 $address = 123 Main, Warsaw, NC, 29876;$valid = /(/d+)/s+(/w+),/s+(/w+),/s+(A-Z2),/s+(/d5)/;if ( preg_match( $valid, $address, $matches ) = 1 ) echo( Street: $matches1 )

23、; echo( Street number: $matches2 ); echo( Street name: $matches3 ); echo( City: $matches4 ); echo( State: $matches5 ); echo( Zip: $matches6 );同样,整个匹配是在索引0处找到的。在哪里找到街道编号?从左侧开始计算,街道编号是由/d+匹配的。左括号是从左侧算起第二个;因此,$matches2是123。$matches4保存城市名称,而$matches6捕捉 ZIP 编码。回页首强大的技术处理文本非常普通,并且 PHP 提供了一些功能使大量操作可以更轻松地完成

24、。下面是需要牢记的一些简写: preg_replace()函数可以对单个字符串或字符串数组进行操作。如果对一个字符串数组而不是一个字符串调用preg_replace(),则数组中的所有元素都将进行替换。在本例中,preg_replace()将返回修改后的字符串数组。 正如其他 PCRE 实现一样,您可以从替换中引用子模式匹配,允许操作进行自引用。为进行演示,考虑统一电话号码的格式。所有标点符号都被删除,而使用点来代替。清单 7 中显示了一种解决方案。清单 7. 用点替代标点符号 $punctuation = preg_quote( ().- );$number = preg_replace( /$/, , $_REQUEST number );$valid = /(2-90-92)(2-90-92)(0-94)/; $standard = preg_replace( $valid, /1./2./3, $number ); if ( strcmp ($standard, $number) ) echo( The standard number is $standard );如果模式匹配,则模式测试和标准电话号码的转换将在一个步骤中完成。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1