正则表达式(REGULAR EXPRESSION)是用于描述字符排列模式的一种语法规则

上传人:仙*** 文档编号:163933548 上传时间:2022-10-23 格式:DOC 页数:37 大小:263.50KB
返回 下载 相关 举报
正则表达式(REGULAR EXPRESSION)是用于描述字符排列模式的一种语法规则_第1页
第1页 / 共37页
正则表达式(REGULAR EXPRESSION)是用于描述字符排列模式的一种语法规则_第2页
第2页 / 共37页
正则表达式(REGULAR EXPRESSION)是用于描述字符排列模式的一种语法规则_第3页
第3页 / 共37页
点击查看更多>>
资源描述
正则表达式(Regular Expression)是用于描述字符排列模式的一种语法规则。它主要用于字符串的模式分割、匹配、查找及替换操作。正则表达式早期仅用于Unix系统程 序,现在已被绝大多数系统、程序所支持。随着正则表达式移植到交叉平台的程序语言的发展,其功能也日益完善。本章将讲述正则表达式的基本知识以及在PHP 中的应用。6.1 正则表达式简介正则表达式的名称源于一系列数学领域的研究成果,其主要的模式匹配思想来自于SNOBOL语言。正则表达式具有一套完整语法体系,提供了一种灵活且直观的字符串处理方法。正则表达式通过构建具有特定规则的模式,与输入信息进行比较,实现字符串的匹配操作。所谓模式是指具有某种共通特征的字符串表达式。例如,对电子邮件地址而言,其共通特性是一般必须包含字符 “”;一个标准的URL地址一般必须以“http:/”或“https:/”开头;搜索相同类型的文件使用类似于“*.php”格式的字符串这 些都是“模式”。在程序语言中,通常将模式表达式(即正则表达式)包含在两个反斜线“/”之间,如“/apple/”。用户只 要把需要匹配的模式内容放入定界符之间即可。作为定界的字符也不仅仅局限于“/”。除了字母、数字和斜线(“”)以外的任何字符都可以作为定界符,像 “#”、“/”、“!”等都是可以的。在PHP中有两套正则表达式函数库。一套是由PCRE(Perl Compatible Regular Expression)库提供的;另一套是由POSIX(Portable Operation System interface)扩展库提供的。前者使用以“preg_”为前缀命名的函数;后者使用以“ereg_”为前缀命名的函数。两者功能相似,只是执行效率略有差异。使用正则表达式的原因之一,是在典型的搜索和替换操作中,只能对确切文字进行匹配,对于动态文本的搜索就有困难了,甚至是不可能的。下面是一个检测数字表示合法性的正则表达式。/-?d+$|-?0xXda-fA-F+$/该正则表达式可以匹配所有二进制、八进制、十进制、十六进制的正负整数。另一个具体的例子是匹配电子邮件地址格式的正则表达式。/0-9a-zA-Z_-+0-9a-zA-Z_-+(.0-9a-zA-Z_-+)0,3$/对于初学者而言,这些可能比较费解。在学习完本章内容后,读者就可以真正理解上述表达式的具体含义了。6.2 正则表达式的语法规则正则表达式描述了一种字符串的排列模式,主要用于字符串的模式分割、匹配、查找及替换等操作。正则表达式是主 要由原子(普通字符,如英文字符)、元字符(有特殊功用的字符)以及模式修正字符组成。一个正则表达式中至少包含一个原子。他们各自功能和含义有所不同, 下面将分别讲述正则表达式的组成元素及其语法规则。6.2.1 原子(Atom)原子是组成正则表达式的基本单位。在分析正则表达式时,应作为一个整体。原子字符是由所有未显式指定为元字符的打印和非打印字符组成。这包括所有的英文字母、数字、标点符号以及其他一些符号。原子包括以下内容。 单个字符、数字,如az,AZ,09。 模式单元,如(ABC)。可以理解为由多个原子组成的大的原子。 原子表,如ABC。 重新使用的模式单元。 普通转义字符。 转义元字符。表6.1列出了正则表达式所使用的普通转义字符。原 子说 明d匹配一个数字;等价于 0-9D匹配除数字以外任何一个字符;等价于 0-9w匹配一个英文字母、数字或下划线;等价于 0-9a-zA-Z_W匹配除英文字母、数字和下划线以外任何一个字符;等价于 0-9a-zA-Z_s匹配一个空白字符;等价于 fnrtvS匹配除空白字符以外任何一个字符;等价于 fnrtvf匹配一个换页符;等价于 x0c 或 cLn匹配一个换行符;等价于 x0a 或 cJr匹配一个回车符;等价于 x0d 或 cMt匹配一个制表符;等价于 x09 或 cIv匹配一个垂直制表符;等价于 x0b 或 cKoNN匹配一个八进制数字xNN匹配一个十六进制数字cC匹配一个控制字符6.2.2 元字符(Meta-character)元字符是用于构造规则表达式的具有特殊含义的字符。如果要在正则表达式中包含元字符本身,必须在其前加上“”进行转义。表6.2列出了正则表达式中支持的元字符。表6.2元字符元 字 符说 明*0次、1次或多次匹配其前的原子+1次或多次匹配其前的原子?0次或1次匹配其前的原子.匹配任何一个字符|匹配两个或多个选择 或 A匹配字符串串首的原子$ 或 Z匹配字符串串尾的原子b匹配单词的边界B匹配除单词边界以外的部分匹配方括号中的任一原子匹配除方括号中的原子外的任何字符()其整体表示一个原子m表示其前原子恰好出现m次m,n表示其前原子至少出现m次,至多出现n次(nm)m,表示其前原子出现不少于m次下面将这些元字符分为几类分别讲解。1原子表原子表“”中存放一组原子,彼此地位平等,且仅匹配其中的一个原子。如果想匹配一个“a”或“e”使用 /ae/,例如:/Praey/ 匹配“Pray”或者“Prey”。原子表“”或者称为排除原子表,匹配除表内原子外的任意一个字符。例如:/pu/ 匹配“part”中的“pa”,但无法匹配“computer”中的“pu”,因为“u”在匹配中被排除。通常,在原子表中用“-”连接一组按ASCII码顺序排列的原子,用以简化书写。如 /x0123456789/可以写成/x0-9/,用来匹配一个由“x”字母与一个数字组成的字符串;/0xX0-9a-fA-F/匹配 一个简单的十六进制数字,如“0x9”。/0-9a-zA-Z_/ 匹配除英文字母、数字和下划线以外任何一个字符,其等价于/W/。2重复匹配正则表达式中有一些用于重复匹配其前原子的元字符:“?”、“*”、“+”。他们主要的不同是重复匹配的次数不同。 元字符“?”表示0次或1次匹配紧接在其前的原子。例如:/colou?r/匹配“colour”或“color”。 元字符“*”表示0次、1次或多次匹配紧接在其前的原子。例如:/可以匹配“”、“”或“”等HTML标签,并且不严格地控制大小写。 元字符“+”表示1次或多次匹配紧接在其前的原子。例如:/go+gle/匹配“gogle”、“google”或“gooogle”等中间含有多个 “o”的字符串。上文中提及的十六进制数字的例子,实际上更加完善的匹配表达式是/0?xX0-9a-fA-F+/,可以匹配“0x9B3C”或 者“X800”等。读者可以自行进行分析。要准确地指定原子重复的次数,还可以使用元字符“”指定所匹配的原子出现的次数。“m”表示其前原子恰好出现m次;“m, n”表示其前原子至少出现m次,至多出现n次;“m, ”表示其前原子出现不少于m次。以下是一些示例。 /zo1,3m/只能匹配字符串“zom”、“zoom”或“zoom”。 /zo3m/只能匹配字符串“zooom”。 /zo3, m/ 可以匹配以“z”开头,“m”结束,中间为至少3个“o”的字符串。 /bo0,1u/可以匹配字符串“bought a butter”中的“bou”和“bu”,其完全等价于 /bo?u/。3边界限制在某些情况下,需要对匹配范围进行限定,以获得更准确的匹配结果。元字符“”(或“A”)置于字符串的开始,确保模式匹配出现在字符串首端;“$”(或“Z”)置于字符串的结束,确保模式匹配出现在字符串尾端。例如,在字符串“Tom and Jerry chased each other in the house until Toms uncle come in”中使用/Tom/或ATom/匹配句首的“Tom”;而/in$/或/inZ/匹配句末“come in”中的“in”。如果不加边界限制元字符,将获得更多的匹配结果。在使用各种编辑软件的查找功能时,可以通过选择“按单词查找”获得更准确的结果。正则表达式中也提供类似的功能。元字符“b”对单词的边界进行匹配;“B”对单词的内部进行匹配。例如:在字符串“This island is a beautiful land”中使用/bisb/可以匹配单词“is”,而与“This”或者“island”无关。/bis/与单词左边界匹配,可以匹配单词 “is”和“island”中的“is”;/Bis/不与单词左边界匹配,可以匹配单词“is”和“This”中的“is”。/BisB/ 将明确的指示不与单词的左、右边界匹配,只匹配单词的内部。所以在这个例子中没有匹配结果。4元字符“.”元字符“.”匹配除换行符外任何一个字符,相当于n(Unix系统)或rn(Windows系统)。例如:/pr.y/可以匹配目字符串“prey”、“pray”或“pr%y”等。通常,可以使用“. *”组合来匹配除换行符外的任何字符串。在一些书籍中也称其为“全匹配符”或“单含匹配符”。例如:/a.*z/ 表示可以匹配以字母“a”开头,字母“z”结束的任意不包括换行符的字符串。“. +”也可以完成类似的匹配功能,所不同的是其至少匹配一个字符。例如:/a.+z/将不匹配字符串“az”。5模式选择符元字符“|”又称模式选择符。在正则表达式中匹配两个或更多的选择之一。例如:在字符串“There are many apples and pears.”中,/apple|pear/在第一次运行时匹配“apple”;再次运行时匹配“pear”。也可以继续增加选项,如 /apple|pear|banana|lemon/。6模式单元元字符“()”将其中的正则表达式变为原子(或称模式单元)使用。与数学表达式中的括号类似,“()”可以作为一个单元被单独使用。例如:/(Dog)+/匹配的“Dog”、“DogDog”、“DogDogDog”,因为紧接着“+”前的原子是用元字符“()”括起来的字符串“Dog”。一个模式单元中的表达式将被优先匹配或运算。系统自动将这些模式单元的匹配结果依次存储起来,在需要时可以用“1”、“2”、“3”的形式进行引用。当正则表达式包含有相同的模式单元时,这种方式非常便于对其进行管理。例如:/d2(W)d21d4$/匹配“12-31-2006”、“09/27 /1996”、“86 01 4321”等字符串。但上述正则表达式不匹配“12/34-5678”的格式。这是因为模式“W”的匹配结果“/”已经被存储。下个位置“1”引 用时,其匹配模式也是字符“/”。当不需要存储匹配结果时使用非存储模式单元“(?:)”。例如:/(?:a|b|c)(D|E|F)1g/ 将匹配“aEEg”。在一些正则表达式中,使用非存储模式单元是必要的。否则,需要改变其后引用的顺序。上例还可以写成 /(a|b|c)(C|E|F)2g/。7模式匹配的顺序在使用正则表达式时,需要注意匹配的顺序。通常,正则表达式按照由左至右的顺序依次匹配。表6.3列出了其他字符的匹配顺序。表6.3模式匹配的顺序顺 序元 字 符说 明1()模式单元2? * + 重复匹配3 $ b B A Z边界限制4|模式选择6.2.3 模式修正符(Pattern Modifiers)模式修正符扩展了正则表达式在字符匹配、替换操作时的某些功能。这些扩展或者说修正增强了正则表达式的处理能 力。模式修正符一般标记于整个模式之外,并且可以组合使用,如“/apple/i”、“/cat|dog/Uis”等。表6.4列出了一些常用的模式修正 符及其功能说明。表6.4模式匹配的顺序模式修正符说 明i可同时匹配大小写字母m将字符串视为多行s将字符串视为单行,换行符作为普通字符看待x模式中的空白忽略不计S当一个模式将被使用若干次时,为加速匹配起见值得先对其进行分析续表模式修正符说 明U匹配到最近的字符串e将替换的字符串作为表达式使用下面是几个简单的示例,用以说明模式修正符的使用,在后面的章节中还会继续讨论。 /apple/i匹配“apple”或“Apple”等,忽略大小写。 /I love you/ix匹配“iLoveYou”,忽略大小写以及空白。 /U 将依次匹配字符串“Cool musicFew years ago”中的“”、“”和“”。而/却匹配到最后一个可用的字符 串,即“Cool music”。 /Uis 将HTML文件视为单行字符穿,忽略大小写和换行符。匹配其中中的所有以“h”开头的标签,如“”、“”等。6.3 PHP中的正则表达式函数在PHP中有两套正则表达式函数库。一套是由PCRE(Perl Compatible Regular Expression)库提供的。PCRE库使用和Perl相同的语法规则实现了正则表达式的模式匹配,其使用以“preg_”为前缀命名的函数。另一套是由POSIX(Portable Operation System interface)扩展库提供的。POSIX扩展的正则表达式由POSIX 1003.2定义,一般使用以“ereg_”为前缀命名的函数。两套函数库的功能相似,执行效率稍有不同。一般而言,实现相同的功能,使用PCRE库的效率略占优势。下面详细介绍其使用方法。6.3.1 正则表达式的匹配1preg_match()函数原型:int preg_match (string $pattern, string $content , array $matches)preg_match ()函数在$content字符串中搜索与$pattern给出的正则表达式相匹配的内容。如果提供了$matches,则将匹配结果放入其 中。$matches0将包含与整个模式匹配的文本,$matches1将包含第一个捕获的与括号中的模式单元所匹配的内容,以此类推。该函数只 作一次匹配,最终返回0或1的匹配结果数。代码6.1给出preg_match()函数的一段代码示例。代码6.1 日期时间的匹配这是一个简单动态文本串匹配实例。假设当前系统时间是“2006年8月17日13点25分”,将输出如下的内容。匹配的时间是:2006-08-17 01:25 pm当前日期是:2006-08-17当前时间是:01:25 pm2ereg()和eregi()ereg()是POSIX扩展库中正则表达式的匹配函数。eregi()是ereg()函数的忽略大小写的版 本。二者与preg_match的功能类似,但函数返回的是一个布尔值,表明匹配成功与否。需要说明的是,POSIX扩展库函数的第一个参数接受的是正则 表达式字符串,即不需要使用分界符。例如,代码6.2是一个关于文件名安全检验的方法。代码6.2 文件名的安全检验通常情况下,使用与Perl兼容的正则表达式匹配函数perg_match(),将比使用ereg()或eregi()的速度更快。如果只是查找一个字符串中是否包含某个子字符串,建议使用strstr()或strpos()函数。3preg_grep()函数原型:array preg_grep (string $pattern, array $input)preg_grep()函数返回一个数组,其中包括了$input数组中与给定的$pattern模式相匹配的单元。对于输入数组$input中的每个元素,preg_grep()也只进行一次匹配。代码6.3给出的示例简单地说明了preg_grep()函数的使用。代码6.3 数组查询匹配6.3.2 进行全局正则表达式匹配1preg_match_all()与preg_match()函数类似。如果使用了第三个参数,将把所有可能的匹配结果放入。本函数返回整个模 式匹配的次数(可能为0),如果出错返回False。下面是一个将文本中的URL链接地址转换为HTML代码的示例。代码6.4是 preg_match_all()函数的使用范例。代码6.4 将文本中的链接地址转成HTML $max_size) $link_text = substr($link_url, 0, $max_size).; else $link_text = $link_url; /生成HTML文字 $text = str_replace($link_url,$link_text,$text); return $text; /运行实例 $str = “这是一个包含多个URL链接地址的多行文字。欢迎访问”; print url2html($str); /*输出结果 这是一个包含多个URL链接地址的多行文字。欢迎访问 */?2多行匹配仅仅使用POSIX下的正则表式函数,很难进行复杂的匹配操作。例如,对整个文件(尤其是多行文本)进行匹配查找。使用ereg()对此进行操作的一个方法是分行处理。代码6.5的示例演示了ereg()如何将INI文件的参数赋值到数组之中。代码6.5 文件内容的多行匹配提示这里只是为了方便说明问题。解析一个*.ini文件,最佳方法是使用函数parse_ini_file()。该函数直接将*.ini文件解析到一个大数组中。6.3.3 正则表达式的替换1ereg_replace()和eregi_replace()函数原型:string ereg_replace (string $pattern, string $replacement, string $string)string eregi_replace (string $pattern, string $replacement, string $string)ereg_replace()在$string中搜索模式字符串$pattern,并将所匹配结果替换 为$replacement。当$pattern中包含模式单元(或子模式)时,$replacement中形如“1”或“$1”的位置将依次被这些子 模式所匹配的内容替换。而“0”或“$0”是指整个的匹配字符串的内容。需要注意的是,在双引号中反斜线作为转义符使用,所以必须使用“0”,“ 1”的形式。eregi_replace()和ereg_replace()的功能一致,只是前者忽略大小写。代码6.6是本函数的应用实例,这段代码演示了如何对程序源代码做简单的清理工作。代码6.6 源代码的清理?php $lines=file(source.php);/将文件读入数组中 for($i=0; $i2preg_replace()函数原型:mixed preg_replace (mixed $pattern, mixed $replacement, mixed $subject , int $limit)preg_replace较ereg_replace的功能更加强大。其前三个参数均可以使用数组;第四个参数$limit可以设置替换的次数,默认为全部替换。代码6.7是一个数组替换的应用实例。代码6.7 数组替换?php /字符串 $string = Name: NamenEmail: EmailnAddress: Addressn; /模式 $patterns =array( /Address/, /Name/, /Email/ ); /替换字串 $replacements = array ( No.5, Wilson St., New York, U.S.A, Thomas Ching, tom, ); /输出模式替换结果 print preg_replace($patterns, $replacements, $string);?输出结果如下。Name: Thomas Ching,Email: tomAddress: No.5, Wilson St., New York, U.S.A在preg_replace的正则表达式中可以使用模式修正符“e”。其作用是将匹配结果用作表达式,并且可以进行重新运算。例如:?php $html_body = “TESTMy Picture”; /输出结果中HTML标签将全部为小写字母 echo preg_replace ( /(*)/e, 1.strtolower(2).3, /此处的模式变量2将被strtolower转换为小写字符 $html_body);?提示preg_replace函数使用了Perl兼容正则表达式语法,通常是比ereg_replace更快的替代方案。如果仅对字符串做简单的替换,可以使用str_replace函数。6.3.4 正则表达式的拆分1split()和spliti()函数原型:array split (string $pattern, string $string , int $limit) 本函数返回一个字符串数组,每个单元为$string经正则表达式$pattern作为边界分割出的子串。如 果设定了$limit,则返回的数组最多包含$limit个单元。而其中最后一个单元包含了$string中剩余的所有部分。spliti是split的 忽略大小版本。代码6.8是一个经常用到关于日期的示例。代码6.8 日期的拆分?php $date = 08/30/2006; /分隔符可以是斜线,点,或横线 list($month, $day, $year) = split (/.-, $date); /输出为另一种时间格式 echo Month: $month; Day: $day; Year: $yearn;?2preg_split()本函数与split函数功能一致。代码6.9是一个查找文章中单词数量的示例。代码6.9 查找文章中单词数量提示preg_split() 函数使用了Perl兼容正则表达式语法,通常是比split()更快的替代方案。使用正则表达式的方法分割字符串,可以使用更广泛的分隔字符。例如,上面 对日期格式和单词处理的分析。如果仅用某个特定的字符进行分割,建议使用explode()函数,它不调用正则表达式引擎,因此速度是最快的。6.4 正则表达式的Web验证应用正则表达式是一套功能强大的字符串处理工具。前面,通过一些代码片段和实例,已经使读者了解了正则表达式的语法及其在PHP中相关函数的使用。下面,将通过更多的实用技巧和高级实例,为读者进一步展示PHP与正则表达式的综合应用。6.4.1 电子邮件地址的校验电子邮件地址是在表单校验时,最常用也最重要的一种数据格式。众所周知,一个合法的邮件地址必须包含一个 “”字符,并将邮件地址分为两个部分。前半部分是用户名,一般由字母、数字、下划线或中划线组成。后半部分是邮件服务器的域名,通常可以被点号“.”分 割多段。正如本章开篇所提到的那个正则表式:/0-9a-zA-Z_-+0-9a-zA-Z_-+(.0-9a-zA-Z_-+)0,3$/这段正则表达式已经基本满足要求。但在实际应用中,一个电子邮件的用户名中仍可以出现点号“.”,并且用户想尽可能的接受来自“.com”、“.org”或“.net”等主域名的邮件。于是这里将其进一步改写完善,如代码6.10所示。代码6.10 电子邮件地址的校验上面这段函数将整个正则表达式分段解析,是比较清晰的。电子邮件的用户名可以由一个“w”格式字符(即数 字、字母或下划线之一);也可以由两个或多个“w”格式字符、“-”或“.”组成,但“-”或“.”只能置于用户名的内部。电子邮件的域名由“.”被分 割为多段,每段中可以包含“w” 格式字符或“-”。通过上面这个例子,读者还应了解到,对于一些复杂问题的处理,可以通过分割(如“”、“.”)或替换(如变量$mid_domain中使用了变量$per_domain相同的部分)等方法进行转化,从而简化处理。否则,只能陷于由符号组成的文字游戏中。6.4.2 多字节字符的校验目前,大多数B/S结构的网络应用大都有一套用户系统。用户通过提供账号和密码,进而获得更多的访问权限。对 于用户账号,可以简单地规定由有限的英文字母或数字等字符组成的。通常情况下,一般保证第一个字符是字母。因此,用户名的校验可以使用正则表达式 “/a-z0-9a-zA-Z_-5,15$/”。这样做方法简便,易于理解。除此以外,有的系统还可以接受以中文汉字、日文假名等多字节字符构成的用户名。然而,正则表达式主要是基于字 节匹配的。如果希望其处理中文字符、双字节或多字节符,并不能直接使用。实际上,各种多字节字符可以分解为由多个单字节字符(或称ASCII码字符号)组 成的字符串,这并不难理解。PHP实际上也是这么处理的(如函数strlen等)。利用这一点,就可以实现对汉字等多字节字符进行简单的处理了。例如,允许以中文作为用户账号的正则达式是“/a-zA-Z_x7f-xffa-zA-Z0-9_x7f-xff7,31$/”。其中“x7f-xff”是指ASCII码值在127255之间的字符。它们经常作为中文字符的首字节出现。所以可以利用其作为中文匹配的标志。注意在PHP变量的命名规则中也可以接受多字节字符。因为与PHP变量名匹配的正则表达式是“/a-zA-Z_x7f-xffa-zA-Z0-9_x7f-xff*/”。这意味着用户可以使用中文的名字命名变量;同时,在变量的使用中也会遇到问题。例如:/用中文命名变量$哇!一个中文变量 = I am a value.;echo $哇!一个中文变 量; /会正确打印出字符串“I am a value.”/会导致问题的变量使用$username = Tom;echo $username先生来自美国。; /不会打印任何东西,PHP解析到的变量名是 /“uesrname先生来自美国。”而不是“uesrname”/正确的写法echo $username先生来自美国。;6.4.3 URL地址的校验另一项经常使用的数据是URL地址。一个标准的URL,例如“”,一般由URL协议名称(如“http”、“https”、“ftp”或“ftps”等)、分界符“:/”和域名组成。从匹配URL的协议开始,可以写成“(http|ftp)s?”。域名部分可以选择是否以“www.”开 头,并且必须以“.com”、“.net”或“.org”等之一结束,可以写为“(www.)?.+(com|net|org)$”。代码6.11给出 了一段URL地址校验的程序代码。代码6.11 URL地址的校验6.4.4 电话号码和邮政编码的校验在用户提交注册信息时,通常包含一些电话号码或邮编地址的数据。这些数据主要是由数字组成的,但也包含一些其 他字符。如一个中国电话号码“(086)-0411-12345678”,括号中是国家地区号,接着是分区号,最后是6到8位的电话号码。代码6.12是 对国内电话号码检查的一个示例。代码6.12 电话号码的校验通过上述代码可以看出,PHP将电话号码的格式放宽了。可以匹配“(086)-0411-12345678” 或者“086.011.123-4567”等号码。这是通过“preg_replace(). -, , $tel)”做到的。同时应该保证至少为一个6位的电话号码如“123456”或“123-456”(这里依照国际惯例,将一个电话号码分隔为两部分而便 于记忆)。根据上面的解释,不难写出一个邮政编码的校验函数,如代码6.13所示。代码6.13 邮政编码的校验与电话号码不同,邮政编码只有简单分隔符号(“-”或空格等)。对于其他国家的邮政编码,可能有不同的位数,如美国通常是5位,只要改变模式为“/d5$/”即可。另外,在这两段函数中分别使用了不同正则表达式函数(ereg或preg_match等)。6.5 UBBCode转义UBBCode(UBB代码)是经常见诸于网络的一种实用技术。UBBCode使用一种类似于HTML风格的 书写方式。例如,一个粗体字在HTML中使用“粗体”,而用UBBCode输入则是“b粗体/b”。在最 终的用户画面中,程序负责将“b”这样的符号转变为HTML中对应的“”。这样的处理方式,避免了直接输入HTML代码所带来的一 些不良后果。简单说,UBBCode实际就是一种模式匹配与替换技术。下面就几个简单的标签进行说明。6.5.1 格式标签格式标签“b”比较简单,其与“/b”包围的部分将以粗体显示。将要替换的文字可能是多行,并且对大 小写不敏感,应该使用“is”的模式修正符。于是这个UBBCode可以写成“/b(.*)/b/is”或者“/b(.+) /b/is”。对应的HTML标签是“1”,这意味着模式中第一个括号中的内容将被替换。运行代码 6.14的例子:代码6.14 格式标签的替换?php $text = b粗体文字1/b 正常文字 b粗体文字2/b ; echo preg_replace(/b(.+)/b/is, 1, $text);/*-输出的结果-粗体文字1/b 正常文字 b粗体文字2*/?显然是有问题,其中的“正常文字”也被包含进了粗体字标签中。这是因为“.*”或“.+”是一种贪婪的匹配, 其将匹配到最后一个可以匹配的字符为止。修改方法是将其改为“.*?”或“.+?” 的非贪婪匹配,即仅匹配到最近一个可匹配字符为止。对于标签“i”、“u” 等都是类似的,这里不再赘述。代码6.15是改写后的程序。代码6.15 格式标签的替换$text = b粗体文字1/b 正常文字 b粗体文字2/b ;echo preg_replace(/b(.+)/b/is, 1, $text);/*-输出的结果-粗体文字1 正常文字 粗体文字2*/6.5.2 电子邮件标签一个电子邮件地址,在UBBCode中可以写成如下的形式。email somebody/email /简单的格式email=somebody电子邮件/email /完整的格式两者的不同在于“完整格式”的邮件地址写在了标签之中,等号“=”之后。下面是这两种格式分别对应的HTML代码。电子邮件somebody和“b”的模式类似,使用“.+?”表示一个需要替换的部分。如果要强调电子邮件地址的格式,可以将“.+?”改为“.w+?.w+?”。“.w+?”表示可以匹配“.”和“w”格式字符。“?”的作用依然是非贪婪的匹配。如下例:preg_replace(/
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 管理文书 > 施工组织


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!