--php字符串的特点

  • 非字符串类型数据用在字符串处理函数中,会自动转化为字符串,再进行处理。比如 strsub(123456789,2,4); //得到"3456"
  • 可以将字符串视为数组,当做字符集合来看待。比如:
 
  
  1. $str = "abcdefg"
  2. echo $str[2]; //能输出"c",但容易让人误认为str是数组,所以用下面的 
  3. echo $str{2}; //输出"c" 
  4.  
  5. //这种用法多用于取字符串中的某几个字符,比如取第0个和第3个字符 
  6. echo $str{0}.$str{3} //第0个连接第3个 

 

--在php中所有字符串处理函数,都不是原字符串上做修改,都是返回一个修改过的新字符串

 

--常用的字符串输出函数

  • echo() //系统指令,可以echo "",也可以echo("")
  • die() //exit()的别名,可以打印一个字符串,推出Php程序。例如
 
  
  1. //如果打开失败,就打印“打开文件失败”并推出php程序
  2. fopen("1.php","r"or die("打开文件失败"); 
  • print() //作用和echo类似,但有返回值(成功返回1,失败返回0),执行效率没echo高,用的很少
  • printf() //格式化输出函数,和c语言一样
  • sprintf() //和printf功能唯一的差别是,它返回一个格式化的字符串,而不是像标准输出设备输出

 

--常用字符串处理函数

  • 过滤左右两边的空白字符(包括空格,制表符,换行等)
    • string rtrim ( string str [, string charlist] )
       //没有第2个参数时,去掉右边空白;第2个参数可以定义需要过滤的特定字符,可以有多个
    • string ltrim ( string str [, string charlist] )
       //没有第2个参数时,去掉左边空白;第2个参数可以定义需要过滤的特定字符,可以有多个
    • string trim ( string str [, string charlist] ) //没有第2个参数时,去掉左、右空白;第2个参数可以定义左右两边需要过滤的特定字符,可以有多个,比如:
 
  
  1. $hello  = "Hello World"
  2. $trimmed = trim($hello"Hdle"); 
  3. var_dump($trimmed); 

将输出:         

 
  
  1. string(5) "o Wor" 
  •  填充空白字符(根据参数还可以填充其他字符)
    • string str_pad ( string input, int pad_length [, string pad_string [, int pad_type]] ) //没有参数3的话,就按pad_length填充空白,有参数3的话,就按参数3填充。pad_type定义了填充的方式。
  • 大小写转换
    • strtoupper() //全转换为大写字母
    • strtolower() //全转换为小写字母
    • ucfirst() //整个字符串的第1个字母,转换为大写字母
    • ucwords() //每个单词第1个字母,转换为大写字母
  •  和Html标签相关的字符串处理函数
    • nl2br() //将字符串中的回车转换为<br>,以在网页中显示为换行。
    • htmlspecialchars() //将字符串里的html标签转换为实体。比如:          
 
  
  1. $new = htmlspecialchars("<a href='test'>Test</a>", ENT_QUOTES); 
  2. echo $new// &lt;a href=&#039;test&#039;&gt;Test&lt;/a&gt; 
  •  
    • string stripslashes ( string str ) //去掉字符串里面的反斜杠"\"。(一个反斜杠直接去掉;两个反斜杠,去掉一个)
    • string strip_tags ( string str [, string allowable_tags] ) //去掉str里面的html里面的html标签,allowable_tags是允许保留的html标签
  •  其他字符串处理函数
    • string number_format ( float number [, int decimals [, string dec_point, string thousands_sep]] ) //将数字按照规定格式化为字符串。decimals规定了保留的小数位数,dec_point规定了小数点的表示方法,thousands_sep规定了千分位的表示方法。
    • string strrev ( string string ) //反转字符串
    • string md5 ( string str [, bool raw_output] ) //计算字符串的md5码

 

--字符串比较函数

  • 按字节顺序比较(比较ascii的大小)
    • int strcmp ( string str1, string str2 ) //str1大于str2,返回1;str1等于str2,返回0;str1小于str2,返回-1。区分大小写。
    • int strcasecmp ( string str1, string str2 ) //忽略大小写,进行比较。
  • 按自然数排序
  • int strnatcmp ( string str1, string str2 ) //按自然数排序的话,s2小于s12

 

--正则表达式

  • 定义:描述字符串排列模式的一种自定义语法规则。
  • 擅长做的事:字符串的分割匹配查找替换
  • 效率:效率比函数低。如果使用函数能做,就不要使用正则。
  • 应用领域:可以在很多计算机语言中使用。
  • 本质:正则表达式也是一个字符串,这个字符串是一些字符按照特定规则组成字符串。它配合函数一起使用,使用时作为模式与输入字符串比较,再进行查找匹配、替换、分割。

 

--在php中提供了两套正则表达式函数库:

  • POSIX扩展正则表达式函数库(以ereg_开头)
  • Perl兼容正则表达式函数库(以preg_开头。推荐使用,效率高)

 

--正则表达式的模式如何编写

语法(任何一个正则表达式都有4部分组成):

  • 定界符号:规定了模式的开始和结束。(除了字母,数字,反斜杠"\"以外的任何字符都可以做定界符。比如## !! {} ||)
  • 原子:正则表达式的最基本单位。每个正则表达式必须至少包含一个原子。只要一个正则表达式可以单独使用的字符,就是原子。
    • 所有打印字符(所有可以在屏幕上输出的字符)和非打印字符(空格、回车等)。
    •  有意义的字符(比如. * ? < >  ()  /)想做原子使用的话,统统使用反斜杠"\"转义字符转义。转义字符可以将有意义的字符转为无意义的,也可以将无意义的字符转为有意义的(比如:转为代表范围的原子)。
    • 可以使用代表范围的原子(系统给的)。
      • \d 表示任意一个十进制的数字
      • \D 表示任意一个非数字的字符。
      • \s 表示任意一个空白字符。(空格、\t、\r、\n、\f)
      • \S 表示任意一个非空白字符。
      • \w 表示任意一个a-zA-Z0-9_(下划线也被认为是字)
      • \W 表示任意一个非字
    • 自己定义的原子表[],可以匹配方括号中的任意一个原子。
      • 方括号内也可以表示范围,用横线表示。比如a至z,表示为[a-z]
      • [^]表示取反,除了方块号内的原子,都算匹配。(^必须在方括号的第一个字符处出现)
      • . 可以匹配除换行符以外的任意字符
  • 元字符:是一种特殊字符,用来修饰原子的不可以单独出现
    • * 表示其修饰的原子可以出现0次,1次,或次。
    • + 表示其修饰的原子可以出现1次或次。(最少要有1次)
    • ? 表示其修饰的原子可以出现0次或1次。
    • {} 自定义其修饰原子出现的次数
      • {m} //m为整数,表示修饰的原子出现m次。(固定次数)
      • {m,n} //m、n都为整数,m<n,表示修饰的原子出现最少m次最多n次。包括m次和n次。
      • {m,} //m为整数,表示修饰的原子出现最少m次,最多无限。
    • ^ 直接在一个正则表达式的第1个字符出现,则表示这个模式必须在字符串的一行的开头处就能匹配
    • $ 直接在一个正则表达式的最后1个字符出现,则表示这个模式必须在字符串的一行的结尾处能够匹配
    • | 表示的关系。它的优先级最低,最后考虑它的功能。例如"/cat|dog/",不是匹配t与d,而是匹配cat与dog。
    • \b 表示一个边界
    • \B 表示一个非边界
    • ()
      • 作为大原子使用。(整个括号中的内容作为一个整体)
      • 改变优先级,加上括号可以提高优先级。
      • 作为子模式使用。正则表达式不只对一个字符串匹配1次,它用整个正则表达式作为一个大模式和字符串匹配,得到的匹配结果放到数组的第1个元素中,然后用每个()中的内容作为一个子模式和字符串匹配,得到的匹配结果顺序放到数组的其他元素中。
      • 可以取消子模式,只是将()作为大原子或改变优先级使用,在括号中的最前面使用“?:”就可以取消()表示的子模式。
      • 逆向引用。
  • 模式修正符号

 

--元字符的优先级

从高到低分下面几个级别,相同级别的按从左到右依次出现才次序。

 
  
  1. \               //转义字符最高 
  2. () (?:) []      //括号次之 
  3. * + ? {}        //表示数量的 
  4. ^ $ \b          //表示位置的 
  5. |               //或的优先级最低 

 

 --模式修正符

  • 格式:"/   /模式修正符"
  • 内容:就是几个字母。可以一次使用一个(每个都有一定的意义),也可以连续使用多个。
  • 作用:是对整个正则表达式调优用的,也可以说是对正则表达式功能的扩展。
  • 常用模式修正符:
    • i 在和模式进行匹配时,不区分大小写
    • m 将字符串视为多行(默认视为一行),看成多行后,^ $就能和每一行的开始和结束处匹配。
    • s 如果没有这个模式修正符,元字符"."默认将不能匹配换行"\n"
    • x 模式中的空白忽略不计
    • e 专门用在preg_replace函数中。使用\e模式后,就可以在replacement参数中使用函数。
    • A 字符串的开头必须和模式匹配,比如"/one/A",作用和"/^one/"一样。
    • Z 字符串的结尾必须和模式匹配,比如"/one/Z",作用和"/one$/"一样。
    • U 关闭贪婪模式

 

--关于正则表达式的贪婪模式

正则表达式默认是比较“贪婪”的,即.*(或者.+)会尽量往后匹配所有能匹配的字符。比如

 
  
  1. "/\<b\>.*\<\/b\>/"去匹配"<b>php</b>aa<b>lamp</b>cc"会匹配到<b>php</b>aa<b>lamp</b> 

 .*会尽量往后匹配,一直到最后一个</b>。

而我们有的时候想让匹配到第一个就行,就要关闭贪婪模式。

关闭贪婪模式有两种方法:

  • 使用模式修正符U关闭贪婪模式。
 
  
  1. "/\<b\>.*\<\/b\>/U"去匹配"<b>php</b>aa<b>lamp</b>cc"会匹配到<b>php</b> 
  •  使用?关闭贪婪模式。比如:
 
  
  1. "/\<b\>(.*?)\<\/b\>/"去匹配"<b>php</b>aa<b>lamp</b>cc"会匹配到<b>php</b>  

 如果这两种方法同时使用,就又开启了贪婪模式,所以不要同时使用

 

--字符串处理函数用于字符串查找

  • string strstr ( string haystack, string needle )   

    Returns part of haystack string from the first occurrence of needle to the end of haystack.

    If needle is not found, returns boolean FALSE.

    如果needle是个数字,那么会将他作为一个字符的ascii的值,查找该值所对应的字符。比如strstr($haystack,100) //字符d的ascii为100,那么就会在haystack里面查找字符d.

    区分大小写。

  • string stristr ( string haystack, string needle )

     与strstr()作用一样,不区分大小写

  • int strpos ( string haystack, mixed needle [, int offset] )

     Returns the numeric position of the first occurrence of needle in the haystack string.

     If needle is not found, strpos() will return boolean FALSE.

     offset规定了从第几个字符开始查找,默认为0.

     区分大小写额。

  • int stripos ( string haystack, mixed needle [, int offset] )

     与strpos()作用一样,不区分大小写

  • int strrpos ( string haystack, string needle [, int offset] )

     与strpos()作用一样,不同的是查找needle最后一次出现的位置。

 

--正则表达式字符串的匹配

作用:通常用在字符串的验证上,验证字符串是否符合某模式。

使用函数:

  • int preg_match ( string pattern, string subject [, array matches [, int flags]] )

      在 subject 字符串中搜索与 pattern 给出的正则表达式相匹配的内容。

      返回 pattern 所匹配的次数。要么是 0 次(没有匹配)或 1 次,因为 preg_match() 在第一次匹配之后将停止搜索。

      如果提供了 matches,则其会被搜索的结果所填充。$matches[0] 将包含与整个模式匹配的文本,$matches[1] 将包含与第一个捕获的括号中的子模式所匹配的文本,以此类推。

  • int preg_match_all ( string pattern, string subject, array matches [, int flags] )  

    在 subject 中搜索所有与 pattern 给出的正则表达式匹配的内容并将结果以 flags 指定的顺序放到 matches 中。

    搜索到第一个匹配项之后,接下来的搜索从上一个匹配项末尾开始。

    返回整个模式匹配的次数(可能为零),如果出错返回 FALSE。 

 

 

--字符串处理函数用于字符串替换

  • mixed str_replace ( mixed search, mixed replace, mixed subject [, int &count] ) 在subject中查找所有search,找到后用replace替换。count返回替换的次数。     有3种使用情况:
    • str_replace(string,string,string) //用字符串替换字符串
    • str_replace(array,string,string) //把数组里面出现的字符串,都统一替换为一个字符串。比如可以将数组设为要过滤的关键字,都统一替换为**
    • str_replace(array,array,string) //将数组的内容一一对应替换,两个数组元素个数要一样。第2个数组参数常用数组函数array_map()生成

 

--正则表达式字符串的替换

  • mixed preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit] )
        在 subject 中搜索 pattern 模式的匹配项并替换为 replacement。如果指定了 limit,则仅替换 limit 个匹配,如果省略 limit 或者其值为 -1,则所有的匹配项都会被替换。
    • 用法1:用字符串替换模式匹配项。replacement是字符串的时候,就可以用这个字符串替换所有匹配的字符。
    • 用法2:用子模式替换模式匹配项。replacement是子模式的时候,可以用这个子模式替换所有匹配的字符。子模式用\n(双引号中用\\n) 形式或${n}(双引号中用\${n})(n 可以从 0 到 99,其中 \\0$0 指的是被整个模式所匹配的文本。对左圆括号从左到右计数(从 1 开始)以取得子模式的数目。)
    • 用法3:replacement中使用函数需要在pattern中使用模式修正符/e,例如:
     
        
    1. preg_replace ("/(<\/?)(\w+)([^>]*>)/e"
    2.               "'\\1'.strtoupper('\\2').'\\3'"
    3.               $html_body);  //这将使输入字符串中的所有 HTML 标记变成大写。
  •  用法4:就是在前两个参数中都使用数组,一次可以将多个模式替换成多个值。

 

--字符串处理函数用于字符串分割

  • array explode ( string separator, string string [, int limit] )

   使用情景:按特定的字符或字符串去分割。

   此函数返回由字符串组成的数组,每个元素都是 string 的一个子串,它们被字符串 separator 作为边界点分割出来。如果设置了 limit 参数,则返回的数组包含最多 limit 个元素,而最后那个元素将包含 string 的剩余部分。

    如果 separator 为空字符串(""),explode() 将返回 FALSE。如果 separator 所包含的值在 string 中找不到,那么 explode() 将返回包含 string 单个元素的数组。

  • string implode ( string glue, array pieces ) 别名jion()

    Returns a string containing a string representation of all the array elements in the same order, with the glue string between each element.比如:

 
  
  1. $array = array('lastname''email''phone'); 
  2. $comma_separated = implode(","$array); 
  3.  
  4. echo $comma_separated// lastname,email,phone 

 

--正则表达式字符串的分割

  •  array preg_split ( string pattern, string subject [, int limit [, int flags]] )

   使用情景:按某个模式去分割。 (比如按数字,或者按标点) 

   返回一个数组,包含 subject 中沿着与 pattern 匹配的边界所分割的子串。

   如果指定了 limit,则最多返回 limit 个子串,如果 limit 是 -1,则意味着没有限制。比如:

 
  
  1. $keywords = preg_split ("/[\s,]+/""hypertext language, programming"); //返回字符串中的各个单词 

 

 --正则表达式数组的匹配

  • array preg_grep ( string pattern, array input [, int flags] )

   preg_grep() 返回一个数组,其中包括了 input 数组中与给定的 pattern 模式相匹配的单元。

 

--转义正则表达式特殊字符

string preg_quote ( string str [, string delimiter] )

  preg_quote()str 为参数并给其中每个属于正则表达式语法的字符前面加上一个正斜线"\"。如果你需要以动态生成的字符串作为模式去匹配则可以用此函数转义其中可能包含的特殊字符。