最新消息:

字符串处理与正则表达式

PHP学习笔记 admin 3251浏览 0评论

主要内容有:

(1)字符串的格式化输出

(2)文本的搜索

(3)字符串的比较和转换

(4)字符串的分割与组合

(5)字符串的加密

一、字符串格式化

1、使用sprintf来格式化字符串

输出字符串的函数最常见的是echo 和print函数。如果要完成更丰富的输出方式,可以使用sprintf和printf函数。sprintf函数与printf函数的区别在于sprintf函数返回格式化后的字符串,而printf函数直接输出。

20130809172345

sprintf函数返回格式化后的字符串结果,结果可以用于新的作用。 %d、%s起到占位符的作用,其中%d表示所在位置处为一个整数,%s表示所在位置处为一个字符串。注意占位符的个数要与args参数一一对应。常用的占位符如下:

20130809172753

2、使用str_pad来补齐一个字符串

str_pad()函数除了能填充字符串,还提供了更多的参数设置。str_pad()函数的声明如下:

20130809173258

二、使用strlen计算字符串长度

strlen()函数的声明为:int  strlen(string str)    。函数返回字符串的长度,空字符串的长度为0.

三、字符串的查找

函数strpos()和stripos()用于查找一个子字符串在一个字符串中出现的位置。这两个函数用法类似,区别是strpos()函数区分大小写。

20130809173806

ps:注意当在源字符串中没有查到子字符串时返回的FALSE,为了与0区分开,需要使用===来判断strpos的返回值(因为0==FALSE,而0===FALSE是假的)。

如果想要查找某个子字符串在指定字符串中最后出现的位置,使用strrpos()函数。与strpos()函数用法一样。

如果要超找字符串时不需要区分大小写,可以使用stripos()函数。

四、使用substr()返回字符串子串

函数substr通过指定起点和长度,获取字符串中其中一部分。

20130809175242

五、使用str_replace替换字符串

20130809175441六、字符串的比较

可以使用==操作符来简单比较两个字符串,如果要完成更复杂的任务,需要使用字符串比较函数。

1、strcmp函数和strncmp函数

strcmp函数用于比较两个字符串是否相等,也可以用于两个字符串的排序(字符串的排序是指可以通过函数的返回值判断两个字符串中字符的ANSCII值大小)。

20130809175917

strncmp的作用与strcmp类似,strncmp多了一个参数,用于指定比较字符串的长度。

20130809200145

2、不区分大小写的比较函数strcasecmp与strncasecmp

函数strcasecmp的功能和函数strcmp相同,但是strcasecmp是不区分大小写的。

20130809200418

函数strncasecmp的功能和函数strcmp相同,但是strncasecmp是不区分大小写的。

20130809200520

七、字符串的转换

1、大小写转换函数strtoupper与strtolower

函数strtoupper的作用是把给定的字符串转换成大写。string  strtoupper(string  str).

函数strtolower的作用是把给定的字符串转换成小写。 string strtolower( string str).

2、首字母大小写转换函数

函数ucfirst可以把字符串的首字母转换为大写,函数声明为:string ucfirst(string str).

函数ucwords可以把字符串中每个单词的首字母转换成大写。函数声明为:string ucwords(string  str).

八、字符串的切分与组合

1、字符串的切分函数explode

字符串切分函数explode可以将字符串按照分隔符分割为一个数组。如下:

20130809201456

2、字符串的合并函数implode

使用字符串合并函数implode,可以将若干个字符串组合成一个字符串,该函数还有一个别名join。通常将需要合并的字符串放到一个数组中,然后对数组调用implode进行处理。

20130809201819

3、函数str_split平均分割字符串

函数str_split可以将指定的字符串平均分割成小块,函数声明如下:array  str_split (string   str  [, int split_length])。其中第一个参数是需要分割的字符串,第二个参数表示每次切割的长度,默认值是1、函数返回切割后字符串存放的数组。

九、使用MD5加密字符串

PHP自带了MD5加密算法的函数,函数名为md5,可以输出字符串的MD5值。函数原型是: string  md5(string  str  [.bool raw_output]),其中参数raw_output默认为FALSE,此时函数输出32位16进制的MD5值。如果raw_output设为TRUE,函数将输出二进制数。

十、正则表达式

PHP提供两种风格的正则表达式,分别是POSIX正则表达式和Perl风格正则表达式。一个用于可移植操作系统接口(Portable Operating System Interface,POSIX),另一个接口用于 Perl Compatible Regular Expressions (PCRE)。基本上,推荐使用第二个接口,因为 PCRE 比 POSIX 实现更加强大,可以提供能在 Perl 中找到的所有操作符。两种正则表达式的语法不同。

20130809202923

20130809203045

1、POSIX风格正则表达式

20130809203620

POSIX风格正则表达式是PHP编译器的默认风格,常用的函数ereg()、eregi()、ereg_replace()、eregi_replace()和sql_regcase()等。匹配字符串功能可以使用函数ereg和eregi函数来实现。

20130809203443

函数eregi与函数ereg功能相同,区别是eregi在匹配字符串时忽略大小写。

20130809204133

20130809204342

2、PCRE-Perl兼容正则表达式函数

perl风格的正则表达式在语法和函数使用上与POSIX有些诧异,Perl风格的正则表达式的函数有:preg_grep()、preg_match()、preg_replace()、preg_split()、preg_quote()等。

20130809204919 20130810103235

 

PHP 提供了用于在文本中查找匹配、将每个匹配替换为其他文本(la 搜索和替换)以及在列表的元素之中查找匹配的正则表达式函数。函数包括:

  • preg_match()
  • preg_match_all()
  • preg_replace()
  • preg_replace_callback()
  • preg_grep()
  • preg_split()
  • preg_last_error()
  • preg_quote()

(1)preg_match()

函数原型:int preg_match(string pattern, string subject, array [matches]);

这个函数会在string中使用pattern表达式来匹配,如果给定了[matches],就会将string记录到[matches][0]中,[matches] [1]代表使用括号”()”记录下来的第一个字符串,[matches][2]代表记录下来的第二个字符串,以此类推。preg如果在string中找到了匹配 的pattern,就会返回”true”,否则返回”false”。

preg_match()返回 pattern 的匹配次数。 它的值将是0次(不匹配)或1次,因为 preg_match()在第一次匹配后 将会停止搜索。 preg_match_all()不同于此,它会一直搜索subject 直到到达结尾。 如果发生错误 preg_match()返回 FALSE

(2) preg_match_all — 执行一个全局正则表达式匹配

函数原型:int preg_match_all ( string $pattern , string $subject [, array &$matches [, int $flags = PREG_PATTERN_ORDER [, int $offset = 0 ]]] )

搜索subject中所有匹配pattern给定正则表达式 的匹配结果并且将它们以flag指定顺序输出到matches中.在第一个匹配找到后, 子序列继续从最后一次匹配位置搜索.matches参数为多维数组,作为输出参数输出所有匹配结果, 数组排序通过flags指定。函数返回完整匹配次数(可能是0),或者如果发生错误返回FALSE

(2) preg_replace()

函数原型:mixed preg_replace(mixed pattern, mixed replacement, mixed subject);

这个函数会使用将string中符合表达式pattern的字符串全部替换为表达式replacement。如果replacement中需要包含pattern的部分字符,则可以使用”()”来记录,在replacement中只是需要用”\\1“来读取。

(3)preg_split()

函数原型:array preg_split(string pattern, string subject, int [limit]); 

这个函数和函数split一样,区别仅在与split可以使用简单正则表达式来分割匹配的字符串,而preg_split使用完全的Perl兼容正则表达式。第三个参数limit代表允许返回多少个符合条件的值。

如:

<?php
//使用逗号或空格(包含" ", \r, \t, \n, \f)分隔短语
$keywords = preg_split("/[\s,]+/", "hypertext language, programming");
?>

(4)preg_grep()

函数原型:array preg_grep(string patern , array input); 

这个函数和preg_match功能基本上,不过preg_grep可以将给定的数组input中的所有元素匹配,返回一个新的数组。

ps:使用Perl风格的正则表达式函数解析速度快于POSIX风格的正则表达式函数,但是POSIX风格的正则表达式函数的语法更简单、易用。

PHP中的正则表达式及模式匹配

PHP中对于正则处理文本提供了两种方式,一种是PCRE方式(PCRE库是一个实现了与perl 5在语法和语义上略有差异(详见下文)的正则表达式模式匹配功能的函数集. 当前的实现对应于perl 5.005.);另一个是POSIX方式。
PCRE 函数库中的函数使用的模式语法非常类似perl. 表达式必须用分隔符闭合, 比如一个正斜杠(/). 分隔符可以使任意非字母数字, 除反斜杠(\)和空字节之外的非空白ascii字符. 如果分隔符 在表达式中使用, 需要使用反斜线进行转义. 自php 4.0.4开始, 可以使用perl样式的(), {}, []以及<>作为分隔符. 更详细的解释参见模式语法.
结束分隔符后面可以紧跟模式修饰符来影响匹配效果. 参见模式修饰符.
PCRE的模式修正符
i (PCRE_CASELESS) 
如果设定此修正符,模式中的字符将同时匹配大小写字母。
s(PCRE_DOTALL)
如果设定了此修正符,模式中的圆点元字符(.)匹配所有的字符,包括换行符。没有此设定的话,则不包括换行符。这和 Perl 的 /s 修正符是等效的。排除字符类例如 [^a] 总是匹配换行符的,无论是否设定了此修正符。
m(PCRE_MULTILINE)
默 认情况下,PCRE 将目标字符串作为单一的一“行”字符所组成的(甚至其中包含有换行符也是如此)。“行起始”元字符(^)仅仅匹配字符串的起始,“行结束”元字符($)仅 仅匹配字符串的结束,或者最后一个字符是换行符时其前面(除非设定了 D 修正符)。这和 Perl 是一样的。当设定了此修正符,“行起始”和“行结束”除了匹配整个字符串开头和结束外,还分别匹配其中的换行符的之后和之前。这和 Perl 的 /m 修正符是等效的。如果目标字符串中没有“\n”字符或者模式中没有 ^ 或 $,则设定此修正符没有任何效果。
x (PCRE_EXTENDED)
如 果设置了这个修饰符, 模式中的没有经过转义的或不在字符类中的空白数据字符总会被忽略, 并且位于一个未转义的字符类外部的#字符和下一个换行符之间的字符也被忽略. 这个修饰符 等同于perl中的/x修饰符, 使被编译模式中可以包含注释. 注意: 这仅用于数据字符. 空白字符 还是不能在模式的特殊字符序列中出现, 比如序列(?(引入了一个条件子组(译注: 这种语法定义的 特殊字符序列中如果出现空白字符会导致编译错误. 比如( ?(就会导致错误.).
e (PREG_REPLACE_EVAL)
如 果这个修饰符设置了, preg_replace()在进行了对替换字符串的 后向引用替换之后, 将替换后的字符串作为php代码评估之行(eval函数方式), 并使用之行结果 作为实际参与替换的字符串. 单引号, 双引号, 反斜线(\)和NULL字符在 后向引用替换时会被用反斜线转义.
仅preg_replace()使用此修饰符, 其他PCRE函数忽略此修饰符.
A (PCRE_ANCHORED)
如果设置了这个修饰符, 模式被强制为”锚定”模式, 也就是说约束匹配使其仅从 目标字符串的开始位置搜索. 这个效果同样可以使用适当的模式构造出来, 并且 这也是perl种实现这种模式的唯一途径.
D (PCRE_DOLLAR_ENDONLY)
如 果这个修饰符被设置, 模式中的元字符美元符号仅仅匹配目标字符串的末尾. 如果这个修饰符 没有设置, 当字符串以一个换行符结尾时, 美元符号还会匹配该换行符(但不会匹配之前的任何换行符). 如果设置了修饰符m, 这个修饰符被忽略. 在perl中没有与此修饰符等同的修饰符.
S
当一个模式需要多次使用的时候, 为了得到匹配速度的提升, 值得花费一些时间 对其进行一些额外的分析. 如果设置了这个修饰符, 这个额外的分析就会执行. 当前, 这种对一个模式的分析仅仅适用于非锚定模式的匹配(即没有单独的固定开始字符).
U (PCRE_UNGREEDY)
这个修饰符逆转了量词的”贪婪”模式. 使量词默认为非贪婪的, 通过量词后紧跟? 的方式可以使其成为贪婪的. 这和perl是不兼容的. 它同样可以使用 模式内修饰符设置 (?U)进行设置, 或者在量词后以问号标记其非贪婪(比如.*?).在非贪婪模式, 通常不能匹配超过 pcre.backtrack_limit 的字符.
X (PCRE_EXTRA)
这 个修饰符打开了PCRE与perl不兼容的附件功能. 模式中的任意反斜线后就ingen一个 没有特殊含义的字符都会导致一个错误, 以此保留这些字符以保证向后兼容性. 默认 情况下, 在perl中, 反斜线紧跟一个没有特殊含义的字符被认为是该字符的原文. 当前没有其他特性由这个修饰符控制.
J (PCRE_INFO_JCHANGED)
内部选项设置(?J)修改本地的PCRE_DUPNAMES选项. 允许子组重名. (译注:只能通过内部选项设置, 外部的/J设置会产生错误.)
u (PCRE8)
此 修正符打开一个与perl不兼容的附加功能. 模式字符串被认为是utf-8的. 这个修饰符 从unix版php 4.1.0或更高, win32版php 4.2.3开始可用. php 4.3.5开始检查模式的utf-8合法性. This modifier turns on additional functionality of PCRE that is incompatible with Perl. Pattern strings are treated as UTF-8. This modifier is available from PHP 4.1.0 or greater on Unix and from PHP 4.2.3 on win32. UTF-8 validity of the pattern is checked since PHP 4.3.5.

 

转载请注明:jinglingshu的博客 » 字符串处理与正则表达式

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

网友最新评论 (1)

  1. strlen() strpos() stripos() strrpos() substr() str_replace() strcmp() strncmp() strcasecmp() strncasecmp() strtoupper() strtolower() explode() implode() md5() preg_grep() preg_match() preg_match_all() preg_rplace()
    admin12年前 (2013-09-02)回复