从零开始攻略PHP(5)——字符串操作与POSIX正则

一、字符串操作

1.字符串的格式化

  1.1 干掉空格

  trim()函数可以除去字符串开始位置和结束位置的空格,并将结果字符串返回。

  ltrim()函数可以除去字符串开始位置的空格。

  rtrim()函数可以除去字符串结束位置的空格。

  1.2 格式化字符串以便显示

  nl2br()函数将字符串作为输入参数,用HTML中的<br />标记代替字符串中的换行符。

  printf()函数将一个格式化的字符串输出到浏览器中。

  sprintf()函数返回一个格式化了的字符串。

  当在类型转换代码中使用printf()函数时,可以使用带序号的参数方式,就是说,参数的顺序不一定要与转换说明中的顺序相同。

printf(“Total aount of order is %2\$.2f(with shipping %1\.2f)”,

$total_shipping,$total);

  strtoupper()函数将字符串转换为大写。

  strtolower()函数将字符串转换为小写。

  ucfirst()函数将第一个字符转换为大写(如果是字母的话)。

  ucwords()函数将字符串每个单词的第一个字母转换为大写。

  1.3 格式化字符串以便存储

  当将数据插入到数据库中的时候可能会引起一些问题,因为数据库会将这些字符解释成控制符。这些有问题的字符就是引号(单引号,双引号)、反斜杠和NULL字符。为了将这些字符进行转义处理,可以在它们前面加一个反斜杠。PHP提供了两个专门用于转义字符串的函数。

  PHP配置将自动添加或去除反斜杠。这个功能是由magic_quotes_gpc配置指令控制的。新版本默认启用。

  如果启用,必须调用stripslashes()函数移除这些反斜杠;否则应该使用addslashes()将它们重新格式化,所有引号将被加上反斜杠。

2.用字符串函数连接和分割字符串

  2.1 分割与组合

  explode()函数把字符串分割为数组。

explode(separator,string,limit)

  separator:根据什么分割

  string:要分割的字符串

  limit:返回数组元素的最大数目(可选)

  如果域名是大写的或者大小写混合的,这个函数就无法正常使用。可以通过将域名转换成全是大写或小写的方法来避免这个问题。

  implode()函数把数组元素组合为一个字符串。join()函数是它的别名。

implode(separator,array)

  separator:数组元素之间放置的内容

  array:要结合为字符串的数组

  2.2 继续分割

  strtok()函数把字符串分割成更小的字符串。

strtok(string,split)

  string:规定要分割的字符串

  split:规定一个或多个分割字符

  2.3 截取

  substr()函数返回字符串的一部分。

substr(string,start,length)

  string:必需。规定要返回其中一部分的字符串。

  start:必需。规定在字符串的何处开始。

    正数 - 在字符串的指定位置开始

    负数 - 在从字符串结尾的指定位置开始

    0 - 在字符串中的第一个字符处开始

  length:可选。规定要返回的字符串长度。默认是直到字符串的结尾。

    正数 - 从 start 参数所在的位置返回

    负数 - 从字符串末端返回

3.字符串的比较

  strcmp()的函数原型如下所示:

int strcmp(string str1, string str2);

  如果这两个字符串相等,该函数就返回0,如果按字典顺序str1在str2后面(大于str2)就返回一个正数,如果str1小于str2就返回一个负数。这个函数是区分大小的。

  strcasecmp()除了不区分大小写之外,其他和strcmp()一样。

  strnatcmp()及与之对应的不区分大小写的strnatcasecmp()将按“自然排序”比较字符串。

  strlen()函数可以检查字符串的长度。

4.使用字符串函数匹配和替换子字符串

  4.1 在字符串中找字符串

  函数strstr()可以用于在一个较长的字符串中查找匹配的字符串或字符。

string strstr(源字符串,目标子字符串);

  如果找到了目标关键字的一个精确匹配,函数将会从目标关键字前面返回被搜索的字符串,否则返回值为false。如果存在不止一个目标关键字,返回的字符串从出现第一个目标关键字的位置开始。

  函数strstr()有两个变体。一个是stristr(),不区分大小写。另一个是strrchr(),会从最后出现目标关键字的位置的前面返回被搜索字符串。

  4.2 查找子字符串的位置

  函数strpos()返回目标关键字子字符串在被搜索字符串中的位置。相比strstr()函数运行速度更快。

int strpos(string haystack, string needle, int [ offset]);

  该函数的可选参数offset是用来指定被搜索字符串的开始搜索位置。

  函数strrpos()也几乎是一样的,但返回的是被搜索字符串中最后一次出现目标关键字子字符串的位置。

  在任何情况下,如果目标关键字不在字符串中,strpos()或strrpos()都将返回false。因此,这就可能带来新的问题,因为false在一个如PHP这样的弱类型语言中等于0,也就是说字符串的第一个字符。

  可以使用运算符“===”来测试返回值,从而避免这个问题:

$result = strpos($test, "H");

if($result === false){

  echo "Not found";

}

else{

  echo "Found at position ".$result;

}

  4.3 替换子字符串

  str_replace()

mixed str_replace(mixed needle, mixed new_needle, mixed haystack[, int & count]);

  四个参数依次对应:原子字符串、新子字符串、源字符串,要执行的替换操作次数(可选)。

  函数substr_replace()则用来在给定位置中查找和替换字符串中特定的子字符串。

string substr_replace(string string, string replacement, int start, int [length]);

  这个函数使用字符串replacement替换字符串string中的一部分。

二、正则表达式

5.正则表达式的介绍

  5.1 科普

  正则表达式是一种描述一段文本模式的方法。

  正则是在一个字符串的某个位置匹配另一个字符串。除了精确匹配字符外,还可以用特殊字符来指定表达式的元意。

  下面我们来介绍POSIX风格的正则。

  5.2 字符集和类

  字符集可以用于匹配属于特性类型的任何字符;事实上它们是一种通配符。

  可以用字符作为一个通配符来代替除换行符(\n)之外的任一个字符:

.at

  如果要限定它是a到z之间的字符:

[a-z]at

  任何包含在方括号([])中的内容都是一个字符类(一个呗匹配字符所属的字符集合)。注意,方括号中的表达式只匹配一个字符。

  可以列出一个集合:

[aeiou]

  也可以描述一个范围:

[a-zA-Z]

  还可以用集合来指明字符不属于某个集:

[^a-z]

  当把脱字符号(^)包括在方括号里面时,表示否。

  许多预定义字符类也可以在正则表达式中使用。

[[:alnum:]] 文字数字字符

[[:alpha:]] 字母字符

[[:lower:]] 小写字母

[[:upper:]] 大写字母

[[:digit:]] 小数

[[:xdigit:]] 十六进制数字

[[:punct:]] 标点符号

[[:blank:]] 制表符和空格

[[:space:]] 空白字符

[[:cntrl:]] 控制符

[[:print:]] 所有可打印的字符

[[:graph:]] 除空格外所有可打印的字符

  5.3 重复

  符号“*”表示这个模式可以被重复0次或更多次,符号“+”则表示这个模式可以被重复1次或更多次:

[[:alnum:]]+

  表示“至少有一个字母字符”。

  5.4 子表达式

  使用圆括号可以表示“至少这些字符串中的一个需要精确匹配”:

(very)*large

  可以匹配“large”、“very large”、“very very large”等。

  5.5 子表达式计数

  可以用在花括号中的数字表达式来指定内容允许重复的次数。{3}表示重复3次,{2,4}表示重复2-4次,{2,}表示至少重复两次:

(very){1,3}

  表示匹配“very”、“very very”和“very very very”。

  5.6 定位到字符串的开始或末尾

  脱字符号(^)用于正则表达式开始,表示子字符串必须出现在被搜索字符串的开始处,字符“$”用于正则表达式的末尾,表示子字符串必须出现在字符串的末尾。

  这个模式将匹配只包含a到z之间一个字符的字符串:

^[a-z]$

  5.7 分支

  可以使用正则表达式中的一条竖线来表示一个选择。

com|edu|net

  5.8 匹配特殊字符

  如果要匹配前面提到过的特殊字符,如点号、大括号或者美元符,就必须在它们前面加一个反斜杠。如果要匹配一个反斜杠,那就用两个反斜杠。

  在PHP中,必须将正则表达式模式包括在一个单引号字符串中。使用双引号引用的正则表示式将带来一些不必要的复杂性。

  5.9 特殊字符整理

  在POSIX正则表达式中,用于方括号外面的特殊字符(在括号外面需要转义的):

\ 转义字符

^ 在字符串开始匹配

$ 在字符串末尾匹配

. 匹配除换行符(\n)之外的字符

| 选择分支的开始

( 子模式的开始

) 子模式的结束

* 重复0次或更多次

+ 重复1次或更多次

{ 最小/最大量记号的开始

} 最小/最大量记号的开始

? 标记一个子模式为可选的

  在POSIX正则表达式中,用于方括号里面的特殊字符(在括号里面需要转义的):

\ 转义字符

^ 非,仅用在开始位置

- 用于指明字符范围

  5.10 在智能表单中应用

  第一种用途是在顾客的反馈中查找特定的名词。 如果使用一个正则表达式,就可以同时匹配若干个:

shop|customer service|retail

  第二个用途是验证程序中用户的电子邮件地址:

^[a-zA-Z0-9_\-.][email protected][a-zA-Z0-9\-]+\.[a-zA-Z0-9\-.]+$

  为什么加斜杠请对照5.9中的说明。

6.用正则表达式查找子字符串

  查找子字符串是正则表达式的主要应用。在PHP中,可以使用的并且用于匹配POSIX风格正则表达式的两个函数是ereg()和eregi()。

int ereg(string pattern, string search, array [matches]);

  该函数搜索字符串search,在pattern中寻找与正则表达式相匹配的字符串。如果发现了与pattern的子表达式相匹配的字符串,这些字符串将会存储在数组matches中,每个数组元素对应一个子表达式。

  函数eregi()除了不区分大小写外,其他与ereg()一样。

  验证邮箱:

if(!eregi(‘^[a-zA-Z0-9_\-\.][email protected][a-zA-Z0-9\-]+\.[a-zA-Z0-9\-\.]+$‘,$email)){

  echo "<p>邮箱格式错误。</p>";

  exit;

}

7.用正则表达式替换子字符串

  ereg_replace()

string ereg_replace(string pattern, string replacement, string search);

  该函数在字符串search中查找正则表达式pattern的字符串,并且用字符串replacement来替换。

  函数eregi_replace()不区分大小写。

8.使用正则表达式分割字符串

  split()

array split(string pattern, string search[, int max]);

  函数将字符串search分割成符合正则表达式模式的子字符串,然后将子字符串返回到一个数组中。

$address = “[email protected]com”;

$arr = split(“\.|@”,$address);

while(list($key, $value) = each($arr)){

  echo “<br />”.$value;

}

  然后发现了一个报错:

  这个问题是版本原因造成的:

  PHP 5.3.0 之后的regex, 希望使用PCRE 的规格, POSIX Regex 都不建议使用了(统一Regex, 避免规格太多?).

  所以下述是不建议使用的Function (POSIX), 与建议替换成的Function (PCRE) 列表, 详可见: PHP: Differences from POSIX regex

    * POSIX → PCRE

    * ereg_replace() → preg_replace()

    * ereg() → preg_match()

    * eregi_replace() → preg_replace()

    * eregi() → preg_match()

    * split() → preg_split()

    * spliti() → preg_split()

    * sql_regcase() → No equivalent

  换成PCRE后:

$address = "[email protected]";

$arr = preg_split("/[\.|@]+/", $address);

while(list($key, $value) = each($arr)){

  echo "<br />".$value;

}

  写到这里略感悲剧,原著中本章的后半段介绍的都是POSIX Regex。PCRE Regex有时间会补更,希望了解关于PCRE的内容,可以阅读在线手册:http://www.php.net/pcre

9.总结

  一般而言,对于同样的功能,正则表达式函数运行效率要低于字符串函数。如果应用程序足够简单,那么就用字符串表达式。

  但是,对于可以通过单个正则表达式执行的任务来说,如果使用多个字符串函数,则是不推荐的。

整理自《PHP和MySQL Web开发》第四版

时间: 2024-08-01 20:35:13

从零开始攻略PHP(5)——字符串操作与POSIX正则的相关文章

从零开始攻略PHP(4)——数组的使用

1.数组的概念 数组就是一个用来存储一系列变量值的命名区域. 每个数组元素有一个相关的索引(也成为关键字),它可以用来访问元素. PHP允许间隔性地使用数字或字符串作为数组的索引. 2.数字索引数组 2.1 数字索引数组的初始化 $products = array(‘Tires’,’Oil’,’Spark Plugs’); 如果需要将按升序排列的数字保存在一个数组中,可以使用range()函数自动创建这个数组. 创建一个1-10的数字数组: $numbers = range(1,10); 可选的

从零开始攻略PHP(7)——面向对象(上)

1.理解面向对象的概念 面向对象软件的一个重要优点是支持和鼓励封装的能力.封装也叫数据隐藏. 在面向对象的软件中,对象是一个被保存数据和操作这些数据的操作方法的唯一.可标识的集合. 对象可以按类进行分类. 面向对象的编程语言必须支持多态性,多态性的意思是指不同的类对同一操作可以有不同的行为.语言支持多态性,可以知道将哪个操作应用于一个特定的对象. 多态性与其说是对象的特性,不如说是行为的特性.在PHP中,只有类的成员函数可以是多态的. 例如,尽管自行车的“移动”和汽车的“移动”在概念上是相似的,

从零开始攻略PHP(6)——代码重用与函数编写的一些注意事项

一个新的项目是这样创建的:它将已有的可重新利用的组件进行组合,并将新的开发难度降低到最小. 代码重用的好处:降低成本.提升可靠性和一致性. 1.使用require()和include()函数 使用一条require()或include()语句,可以将一个文件载入到PHP脚本中. require()和include()几乎相同.区别是函数失败后,require()函数将给出一个报错.Include()给的则是警告. 变体函数分别是require_once()和include_once().作用是确

《Linux Shell脚本攻略》 笔记 第三章:文件操作

<Linux Shell脚本攻略> 笔记 第三章:文件操作 1.生产任意大小的文件 [[email protected] dd_test]# [[email protected] dd_test]# dd if=/dev/zero of=junk.data bs=1k count=10 10+0 records in 10+0 records out 10240 bytes (10 kB) copied, 0.00137023 s, 7.5 MB/s 2.文件系统相关测试 [ -f $file

webBrowser中操作网页元素全攻略

webBrowser中操作网页元素全攻略 2012-12-20 14:21 188人阅读 评论(0) 收藏 举报 1.获取非input控件的值: webBrowser1.Document.All["控件ID"].InnerText; 或webBrowser1.Document.GetElementById("控件ID").InnerText; 或webBrowser1.Document.GetElementById("控件ID").GetAttr

.Net常用技巧_VS2005[C#] 操作 Excel 全攻略(转)

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using Microsoft.Office.Interop.Excel; using System.Data.SqlClient; using System.Data.

javascript 操作 excel 全攻略

最近做一个项目,用到了javascript操纵excel以生成报表,下面是标有详细注解的实例 <html> <head><script language="javascript" type="text/javascript"> </script><script language="javascript" type="text/javascript">function

对于PDF文件压缩怎么操作? PDF文件压缩攻略

PDF文件压缩怎么操作呢?在我们日常工作中,由于工作性质的不同,所要使用到为文件都有大小的限制.如果是在处理PDF文件,需要你将它压缩成比较小的PDF文件,对于其它文件的压缩可能都遇到过,PDF文件就很少有人处理过,下面分享一种PDF文件压缩攻略交给大家! 1.首先压缩PDF文件的话大家可以在浏览器中搜索到PDF压缩工具,然后将它安装到操作的电脑中,考虑到每个工具操作工具方法不同,建议大家使用到同一款软件.2.进入到PDF工具中,可以看到软件界面中分布层次分明,然后可以移动鼠标到左侧"PDF的其

攻略:苹果手机投屏电脑 iPhone镜像投屏怎么操作

外出游玩拍照已经是必不可以少的一项程序,记下美好的瞬间,回到家中,可以与家人一起分享,每个照片背后都是一个小故事,那如果全家很多人想一起浏览这些照片怎么办呢?不会只是想通过家庭群吧!那对于一些年龄稍长的人来说是不会操作的,此时是不是都会想到将小小的手机屏幕上的内容在电脑上展示出来,奈何又不会操作,其实很简单,特别是对苹果,因为镜像投屏功能的支持,那如何将苹果手机投屏到电脑中呢? 使用工具:迅捷苹果录屏精灵 方法/步骤:1.如今的科技如此发达,投屏已经是很简单的操作了,接下来说的适用于iPhone