PHP和MySQL开发—第四章 字符串操作与正则表达式

第四章 字符串操作与正则表达式

1.mail()函数

  • bool mail (string to, string subject, string message,string[additional_headers[, string additional_parameters]]);
    • string to、string subject、string message这三个参数是必需的,分别代表发送邮件的目的地址、主题行和消息内容。
    • addational_headers 的第四个参数可以用来发送任何额外的、有效的邮件头。
    • addational_parameters的第五个参数可以向任何经过配置用来发送电子邮件的程序传递参数。

2.字符串的格式化

  • 整理字符串
    • 整理字符串首先要清理字符串中多余的空格。为了将字符串存入文件或数据库中,或者将其与别的字符串进行比较,就是非常需要的一步。
    • trim()函数、ltrim()函数和rtrim()函数(rtrim别名又叫chop)
      • 该函数可以除去字符串开始位置和结束位置的空格,并将结果字符串返回。
      • 衍生函数:ltrim()和rtrim()函数,他们两个的使用和trim()函数是一样的,区别在于trim()是除去字符串开始和结束位置的空格;而ltrim()函数是去除开始(左边)位置的空格;rtrim()是去除结束(右边)为止的空格。
      • 除去的字符:
        • 默认的情况下,除去的字符是换行符和回车符(\n 和 \r),水平和垂直制表符(\t 和\x0B)、字符串结束符(\0)和空格。
        • 除此之外,还可以通过设置trim()函数的第二个参数来提供要过滤的特殊字符。
  • 格式化字符串并显示
    • nl2br()函数
      • 该函数是使用HTML格式化,其将字符串作为输入参数,用XHTML中的<br />标记代替字符串中的换行符。

      • 该函数在字符串中的每个新行(\n)之前插入HTML换行符(<br><br \>)

      • 因为<br />是html中的写法,在PHP中无法用来划分长字符串;如果想将一个长字符串显示在浏览器中的话,使用nl2br会更有效。

      • 举例来说:

      • <p><?php echo nl2br($mailcontent);?></p><p><?php echo "Customer name:".$name."<br />"."Customer email:".$email."<br />"."Customer coments:".$feedback."<br />";?></p> 实际效果大致相同。

      • echo nl2br($mailcontent);效果图
      • echo "Customer name:".$name效果图
  • printf()函数
    -void printf(string format [, mixed args...]);
    • 该函数是将一个格式化的字符串输出的浏览器中。
    • 该函数的第一个参数都是字符串格式,它使用格式代码而不是变量来描述输出字符串的基本形状。
    • 其他参数是用来替换格式字符串的变量。
    • 该函数的优点在于,可以使用更有用的转换说明来制定$total为一个浮点数。
      • 例如:printf("Total amount of order is %.2f", $total);
      • 上述代码打印出的$total中12.4将改为12.40。
    • echo "Total amount of order is $total.";printf("Total amount of order is %s.",$total); 的结果相同。
      • 格式化字符串的%s是转换说明。
      • 转换格式
        • %['padding_character][-][ width][.precision]type
        • 所有转换格式都遵循同意的格式。
        • 所有转换说明都以%开始。如果想打印一个%符号,必须使用%%
        • 参数padding_character是可选的,其将被用来填充变量直至所指定的宽度;其默认的填充字符是一个空格,如果指定了一个空格或0,就不需要'作为前缀了。
        • -也是可选的,它指明该域中的数据应该左对齐,如果不添加,则默认是右对齐。
        • width参数告诉printf()函数在这里为将被替换的变量留下多少空间(按字符计算)。
        • precision便是必须是以一个小数点开始。简单来说就是表明小数点后面要保留(显示)的位数。
        • 转换说明的类型码
          • %:文字百分比字符。不需要参数
          • b:参数被视为整数,并显示为二进制数
          • c:整数,并作为字符输出(ASCII值的字符)
          • d:整数,并作为小数输出
          • f:双精度数,并作为浮点数输出
          • e:科学计数法(1.2e+2).
          • o:整数,并作为八进制数输出
          • s:字符串,并作为字符串输出
          • u:整数,并作为非指定小数输出
          • x:整数,并作为带有小写字母a~f的十六进制数输出
          • X:整数,并作为带有大写字母A~F的十六进制数输出
    • 使用带序号的参数方式来调用参数。
      • printf("Total amount of order is %2\$.2f(with shipping %1\$.2f)",$total_shipping,$total);
        • 上述代码中,%2\$.2f代表着使用列表中的第二个参数替换。
        • 在%符号后添加参数的位置,并且以$符号位结束,这样就意味着参数的顺序并不一定要与转换说明中的顺序相同。
    • vprintf()函数和vsprintf()函数
      • 上述两个函数更多的是针对与数组,它们需要接受两个参数:格式字符串和参数数组,而不接收可变数量的参数。
        -** 改变字符串大小写**
    • 可以重新格式化字符串中的字母大小写。
    • 相关函数和效果
      • $abc="total Amount of Order";为例

      • strtoupper()

        • 将字符串转换为大写。
        • echo strtoupper($abc)
        • strtoupper()
      • strtolower()

        • 将字符串转换成小写
        • echo strtolower($abc);
strtolower()
    - ucfirst()
        - 如果字符串的第一个字符是字母,就大写该字母。
        - `echo ucfirst($abc);`
        - 
ucfirst()
    - ucwords()
        - 将字符串每个单词的第一个字母转换为大写
        - `echo ucwords($abc);`
        - 
ucwords()
  • 格式化字符串后存储
    • 目的是为了将重新格式化的字符串更便于存入数据库。
    • 之所以要这么做是因为数据库有时候会将某些字符解释成控制符。比如"",'',\和NULL字符。
    • 很多时候的做法是我们在这些字符前面加上转义字符(也就是\),这样""就变成了" ",' ',\。
    • 转义字符对所有特殊字符都通用,所以如果某个字符串中存在\\这样的特殊字符,则转义的显示为\\。
    • addslashes()函数
      • 该函数是PHP中专门用于转义的函数。
      • 该函数和其他函数一样,需要一个字符串作为输入参数;然后经过处理之后,返回一个重新格式化后的字符串。
      • $feedback=addslashes(trim($_POST['feedback']));为例
      • 不加addslashes()函数前
      • 加了addslashes()函数后
      • 现在的PHP版本 对所有的 GET、POST 和 COOKIE 数据自动运行 addslashes()。所以不需要对已经转义过的字符串使用addslashes()函数,因为一旦使用就会导致双层转义。
    • stripslashes()函数
      • 该函数可用于删除有addslashes()函数添加的反斜杠。
      • 也可用于清理从数据库中或从THML表单中取回的数据中的数据

3.连接和分割字符串

  • explode()、implode()和join()
    • explode()函数
      • array explode( string separator, string input [, int limit]);
      • 该函数带有一个输入字符串作为参数,并根据一个指定的分隔符字符串将字符串本身分割为小块,将分割后的小块返回到一个数组中。
      • limit参数是可选参数,其可以用来限制分成字符串小块的数量。
      • 举例:
        • $email=trim($_POST['email']);
          $email_array=explode('@',$email);
          print_r($email_array);
已经被分成了数组
- *implode()和join()函数*
    - 两个函数的结果是一致得,他们所实现的效果与explode()正好相反。
    - 举例:
        - `$emailArray=explode('@',$email);`
`$newArray=implode('*',$emailArray);`
`echo gettype($newArray)."->".$newArray;`

        - 
又被合成回了一个字符串变量
  • strtok()函数
    • string strtok(string input, string separator);
    • 该函数可以一次只从字符串中取出一些片段(token),这与explode()函数的每次将一个字符串全部分割成若干小块是不同的。
    • 对于从字符串中取出单个单词的处理来说,strtok()函数效果更好一些。
    • 该函数的分隔符可以是一个字符,也可以是一个字符串;但需要注意的是,输入的字符串会根据分隔符字符串中的每个字符来进行分隔,而不是根据整个字符串来分隔。
    • 如果为了获得首个token,在调用该函数时,需要输入两个参数:一个是要进行token化的字符串,还有进分隔符;而在之后的调用中,则可以只用分隔符一个参数。
    • 举例:
      $feedBack=addslashes(trim( $_POST['feedback']));
      $token=strtok($feedBack," ");
      echo $token."<br />";
      while ($token!=" "){
      $token=strtok(" "); //当今性二次调用的时候就不用再次输入调用的字符串了
      echo $token."<br />";
      }
根据空格进行分割
  • substr()函数
    • string substr(string string., int start[, int length]);
    • 该函数允许我们访问一个字符串给定起点和终点的子字符串,换句话说就是返回substr()函数所选定的一部分字符串。
      • string必选参数。指定所要返回那一部分字符串。
      • start必选参数。指定字符串从指定的位置开始。
        • 正数:从字符串指定的位置开始
        • 负数:从字符串结尾开始的指定位置开始。
        • 0:从字符串中的第一个字符处开始;字符串和数组一样,起点都是从0开始的
        • 如果只用正数作为子字符串起点来调用这个函数,则得到的是从起点到字符串结束的整个字符串。
          • 举例:
            $test= 'Your customer service is excellent'; echo substr($test,1);
从1开始到结束的字符串
    - 如果用负数作为子字符串起点来调用这个函数,得到的则是从该字符串末端返回的长度。
        - 举例:
        `$test= 'Your customer service is excellent';

echo substr($test,-17);`
-

从字符串末端往前倒推

    - length参数。
        - 可选,规定被返回字符串的长度。
        - 默认是到字符串结尾。
        - 正数:从start参数所在的位置往后所返回的length长度。
        - 负数:从字符串末端返回的长度
        - 举例:
            - `$test= 'Your customer service is excellent';

echo substr($test,1,13);`
-


正数:返回从第1个开始到正数第13个字符
            - `$test= 'Your customer service is excellent';

echo substr($test,1,-1);`
-


负数:返回从第1个开始到倒数第1个字符

4.比较字符串

  • ==
    • 最简单的方法:使用"=="来比较两个字符串是否相等。
  • strcmp()、strasecmp()和strnatcmp()
    • strcmp()
      • int strcmp(string str1,string str2)
      • 如果str1==str2,则该函数返回0;
        • $str1="abc";
          $str2="abc";
          echo strcmp($str1,$str2);

str1=str2

- 如果str1>str2,则该函数返回一个整数。
- $str1="abc";
$str2="ABC";
echo strcmp($str1,$str2);
-
str1>str2

- 如果str1<str2,则该函数返回一个负数。
- $str1="ABC";
$str2="abc";
echo strcmp($str1,$str2);
-
str1<str2

- 该函数区分大小写
- a>z>A>Z
- strcasecmp()函数
- 除了不区分大小写之外,其他和strcmp()函数一样。
- $str1="ABC";
$str2="abc";
echo strcasecmp($str1,$str2);
-
不区分大小写

-   strnatcmp()函数
    -   除了不区分大小写之外,该函数还会按照自然排序比较字符串。
            -   自然排序是指按人们习惯的顺序进行排序。
                -   比如在字典排序上来看2>12,因为2在12前面。
                -   而自然排序来说12>2。
    - `$str1="2";`

$str2="12";
echo strcasecmp($str1,$str2)."<br />";
echo strnatcmp($str1,$str2);
-

strcasecmp:"2">"12";strnatcmp:"2"<"12"

  • strlen()函数
    • 该函数用来检查字符串的长度。
    • echo strlen("Hello World");
    • 该函数计算空格

5.匹配和替换字符串

  • strstr()、strchr()、strrchr()和stristr()函数
    • 上述函数都是在一个字符串中查找另一个字符串
    • strstr()函数
      • string strstr(string haystack, string needle);
      • 该函数可以用于在一个较长的字符串中查找匹配的字符串或字符。
      • strchr()和strstr()完全一样,这两个函数都可以在字符串中查找一个字符串,包括只包含一个字符的字符串。
      • 想要使用该函数必须向该函数传递一个要被搜索的子字符串参数和一个目标关键字字符串参数。
      • 如果只找到了该关键字的一个精确匹配,则会从目标关键字前面返回被搜索的字符串,否则返回值为false。
      • 如果存在不止一个关键字,则返回的字符串从出现的第一个目标关键字的位置开始。
      • 举例:
      • $toaddress="feedback@example.back.com";
        echo strstr($toaddress,"exa");
只有一个关键字
    -       `$toaddress="feedback@example.back.com";`

echo strstr($toaddress,"exa");
-

不止一个关键字

- *stristr()函数*
    - 该函数是strstr()的变体,主要区别在于不区分字符的大小写。
- *strrchr()函数*
    - 该函数作用和strstr()一样,区别在于会从最后出现目标关键字的位置的前面返回被搜索字符串;简单来说就是从后往前搜索。
    - 该搜索在实际使用中与strstr()函数还有一点不同在于,该搜索从后向前搜索时,遇到第一个精确匹配的关键字之后就返回结果了,不再向前继续搜索。
    -  `$toaddress="feedback@example.back.com";`

echo strrchr($toaddress,"back");
-

找到back后就不再继续向前搜索了

  • strpos()、strrpos()函数
    • 这两个函数都是返回目标关键字子字符串在北搜索字符串中的位置。
    • 现在PHP建议在查找某个子字符串在字符串中出现的位置时候,推荐使用strpos()函数来代替strstr()函数,因为前者查找速度更快。
    • strpos()函数
      • int strpoe(string haystack, string needle, int[offset]);
      • 该函数区分大小写。
      • 举例:
        • $test="hello world";
          echo strpos($test,"r");
      • "r"在字符串$test中位于第8个(从0开始)
      • 该函数offset参数可以用来指定被搜索字符串的开始搜索位置。
        • 举例:
        • $test="I still haven't received delivery of my last order.";
          echo strpos($test,"s",5);
        • 读作42,实际是43
        • 该函数是从$test字符串第5个开始对"s"进行搜索,所以看不到第2个位置的"s"(记住字符串也是从0开始计数),下一个"s"出现在第42(实际43)个位置
    • strrpos()函数
      • 该函数返回的是被搜索字符串中最后一次出现目标关键字的子字符串的位置;简单来说就是从后往前搜索到精确匹配子字符串的位置。
      • 举例:
        • $test="I still haven't received delivery of my last order.";
          echo strpos($test,"s")."<br />";
          echo strrpos($test,"s");
正数第2个和正数第42个
        - 同样是搜索"s",strpos()搜索到的是正数第2个,strrpos()搜索到的则是正数第42个。
-   存在的问题:
    -   因为无论在什么情况下,strpos()和strrpos()函数如果查不到目标关键字,则其会返回false。而对于PHP来说false等于0,而0又代表着所查找字符串的第一个字符,这将可能使得今后对字符串的操作造成问题。为了避免此问题的出现,我们是时候用上"==="了。
    -   `$test="I still haven't received delivery of my last order.";`

$result=strpos($test,"x");
if($result===false){
echo "Not found";
}else{
echo "Found at position".$result;
}
echo "<br />".gettype(strpos($test,"x"));
echo "<br />".gettype(strrpos($test,"s"));
-

一旦找不到该关键字,就会变成布尔型

  • 替换字符串

    • 该操作也可以用字符串函数或者正则表达式函数来实现。
    • str_replace()函数
      • mixed str_replace(mixed needle,mixed new_needle, mixed haystack[, int & count]);
      • 个人理解:
        • needle:查找的值;
        • new_needle:替换查找到的值(替换needle);
        • haystack:包含查找值()needle)的被搜索字符串;
        • count:统计替换的次数。
      • 该函数用new_needle替换所有的haysatck中的needle,并且返回haystack替换后的记过。
      • count是可选的,它包含了要执行的替换操作次数。
        • 举例:
          • $arr = array("blue","red","green","yellow");
            print_r(str_replace("red","pink",$arr,$i));
            echo "替换数:$i";
            -
            $i计算替换的次数
      • 该函数区分大小写;如若不想区分则应该使用str_ireplace()函数。
      • 该函数必须遵守的规则:
        • 如果搜索的字符串()是数组,那么它也将返回数组;
        • 如果搜索的字符串是数组,那么它将对数组中的每个元素进行查找和替换;
        • 如果同时需要对数组进行查找和替换,并且需要执行替换的元素少于查找到的元素的数量,那么多余元素将用空字符串进行替换;
          • 举例:
            • $find = array("Hello","world");
              $replace = array("B");
              $arr = array("Hello","world","!");
              print_r(str_replace($find,$replace,$arr));
            • world被替换成了空字符
        • 如果查找的是数组,而替换的是字符串,那么替代字符串将对所有查找到的值起作用。
      • 该函数可以用来替换敏感词。
  • substr_replace()函数

    • string substr_replace(string string, string replacement, int start, int [length]);
    • 个人理解:
      • string:需要检查的字符串
      • replacement:需要替换的字符串
      • start:在字符串的何处开始替换,所谓的偏移量
      • length:要替换多少个字符
    • 该函数是把字符串的一部分替换成另外一个字符串。
    • start参数
      • 正数:在字符串中的指定位置开始替换;

        • echo substr_replace("Hello world","Shanghai",7);
        • 从第7个字符开始替换
      • 负数:从字符串末尾的指定位置开始替换

        • echo substr_replace("Hello world","Shanghai",-3);
        • 从倒数第3个字符开始替换
      • 0:从字符串第一个位置开始替换

        • echo substr_replace("Hello world","Beijing",0);
        • 从0开始的字符串
        • 0的特点在于如果replace的字符串数量小于string的话,则string多出来的也不会显示。
    • length参数(可选)
      • 正数:被替换的字符串长度;
        • echo substr_replace("Hello world","Beijing",0,2);
        • 被替换的字符串长度为2
      • 负数:等待替换的子字符串结尾处距离string末端的字符个数;
        • echo substr_replace("Hello world","Beijing",0,-2);
        • 距离末端2个字符个数
      • 0:插入而非替换
        • echo substr_replace("Hello world","Beijing",0,0);
        • 插入而非替换
  • 正则表达式

    • 字符串函数的使用只限于进行精确匹配或精确的字符串匹配;而如果希望完成一些更复杂的模式匹配,则应该尝试使用正则表达式。
    • 正则表达是是一种描述一段文本模式的方法;精确匹配其实也是一种正则表达式,比如搜索字符串“love”,其实就是一个正则表达式。
    • 使用正则表达式,可以更具体地指明希望匹配的字符类型,并且可以指明字符所属的一个集合。
      • 比如想要寻找以og结尾的字符串,就可以用.at来表示;
        • 但这样的用法有一个缺陷在于所查找出来的at结尾的字符串可能会包含特殊字符,如:#og,&og等。
        • 如果想要把其限定在英文字母内,则应该写作[a-z]og或者[A-Z]og亦或者[a-zA-Z]og,这样就可以更精确的找出例如dog的、Tog等字符串。
    • 关于脱字符(^)
      • 如果脱字符()被包括在方括号里面,如[a-z],则表示否;
      • 如果放在方括号外则会有两种情况:
        1.放在正则表达式前,如:^[a-zA-Z0-9_-]这种情况,则表示正则表达式的开始;在实际运行时则会根据后方的正则表达式来匹配应内容。
        2.而如果仅仅是单独使用,则会被解释为一般的特殊字符;同样的如果想要在正则表达式中使用^作为一般特殊字符,则需要在其前面加上转义字符(\),如\^
POSIX正则表达式中,用于方括号([])外面的特殊字符
POSIX正则表达式中,用于方括号([])里面的特殊字符

正则表达式入门:http://www.cnblogs.com/deerchao/archive/2006/08/24/zhengzhe30fengzhongjiaocheng.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容