PHP 字符操作学习记录

1.PHP 字符串是二进制安全,可以任意加长与缩短,大小限制为PHP可以使用的内存数量;Tips: 通常情况下PHP默认为ASCII字符串,对于其它数据的字符编码,可能需要转换。

2.初始化的形式:单引号,双引号,heredoc 三种

  2.1 单引号: 在这里面的字符串只需要转义反斜杠与单引号本身。此中字符串,PHP不会检查里面的变量和转义序列(查看双引号中说明),所以速度比较快

    例如:

      print 'I\'m boy!'; // 转义单引号,结果: I'm boy!

      print 'c:\\php'; // 转义反斜杠,结果: c:\php

      print 'It is cost $12.03 \n '; // 不转义变量与转义序列,结果:It is cost $12.03 \n

  2.2 双引号: 不识别转义的单引号,但识别变量与转义序列(如下表)

    转义序列  字符

    \n        换行符(ASCII-->10)

    \r        回车符(ASCII-->13)

    \t        制表符(ASCII-->9)

    \$        美元符号

    \\        反斜杠

    \"        双引号

    \0~\777   8进制数值

    \x0~\xFF  16进制数值

    例如:

      print "The sauce cost \$\061\060.\x31\x35 \n"; // 美元符号、8进制、16进制数值、换行符

  2.3 heredoc形式:使用 <<< 符号添加"记号",然后最后以"记号+分号"结束(特殊情况:如果做了字符串拼接,则分号不是必需的)。按约定记号通常大写,结束的时也一样,这是大小写敏感的。此定义的字符串,保留了换行符、空格、引号,主要作用在输出HTML的数据,因为不需要转义HTML的中双引号。

    例如:

      print <<< END

          my name is yangping,

          my age is 25 years!

          <a href="">Login</a>

      END; // 结果会输出现两排字符串,Tips:此例子前面不应该有空格,即print要顶格写


      $li = '<li>1111111</li>';

      $html = <<< MYHTML

        <body><ul>

        MYHTML

        .$li.'</ul></body>';

      echo $html; // 注意为了使PHP识别记号,后面的连接字符不能与结束记号同行!

3.字符串由字符组成,可以通过方括号(大括号)+索引取到对应的字符。Tips:推荐使用大括号,用于与数组索引的区分

  例如:

    $a = 'abcedf'; echo  $a[2], "\t", $a{2}, "\n"; // 结果为 c

4.常用字符串API:

  strpos: 查询字符串首次出现的位置。

      返回值:没找到返回false,注意如果是在第一个位置,则返回0,判断的时候用 === 或 !== ,否则出错

      例子:

      if(strpos('[email protected]', '@') === false) { echo '没找到!'; }

      或者

      if(strpos('[email protected]', '@') !== true) { echo '没找到!'; }

  substr: 截取指定字符串。 $substring = substr($string, $start, $length);

    例子:

    $a = 'watch out of that tree';

    echo substr($a, 6), '&nbsp; 到结尾,$start的值大于字符串的长度就返回false<br/>';

    echo substr($a, 6, 5), '&nbsp; 从6开始取5个长度<br/>';

    echo substr($a, -6), '&nbsp; 倒着数6位开始,到结尾<br/>';

    echo substr($a, -6, 5), '&nbsp; 倒着数6位开始,取5个长度<br/>';

    echo substr($a, -strlen($a) - 9), '&nbsp; 负值且超过字符串长度,则视为0<br/>';

    echo substr($a, 5, -2), '&nbsp; 负的长度,会截取最后两位<br/>';

    echo substr($a, -6, -1), '&nbsp; 负的长度,会截取最后两位<br/>';

  substr_replace: 替换子字符串。

    $b = 'Replace_String';

    $c = <<< end

      It's funny when signs say things like:

        Original "Root" Beer

        "Free" Gift

        Shoes cleaned whild "you" wait

        or have other misquoted words.

    end;

    echo substr_replace($c, $b, 3), '&nbsp; 没有指定替换的长度,将替换到结尾<br/>';

    echo substr_replace($b, 'XXXX ', 0, strlen($b)-4), '&nbsp; 指定长度,只保留最后4位<br/>';

    echo substr_replace($b, 'GGGG', -10, 3), '&nbsp; 开始位置为负的,倒着数,替换3位长度<br/>';

    echo substr_replace($b, 'YYYY', 0, 0), '&nbsp; 开始与长度都是0,就插入到旧字符串的头处<br/>';

  strrev: 按字节反转字符串

    例子:

      echo strrev('string'), '&nbsp;按字节反转字符串<br/>';

  explode: 根据指定字符分割字符串,返回数组

  implode(可以参考 join ): 用指定的字符连接数组,组成字符串,返回字符串

  array_reverse: 反转数组中的值,key不变

    以上三个函数的例子如下:

      $s = 'Once upon a time there was a turtle';

      $words = explode(' ', $s); // 按空格分解为数组

      $words = array_reverse($words); // 通过数组反转字符

      echo $s, '<br/>', implode(' ', $words), '<br/>'; // 把数组的值重新组合

  preg_replace_callback: // 参考API

  ucfirst或ucwords: 将一个或多个单词的首字母转换为大写形式,其它地方的字符不变;Tips: 对于ucwords而言,一个单词是指任何非空白字符序列后面跟一个或多个空白字符。此函数的使用会考虑到本地化的设置。

    例子:

      echo ucfirst('how do you do today?'), '&nbsp; 把字符串的首字母转为大写形式<br/>';

      echo ucwords('how do you do today?'), '&nbsp; 把字符串中每个单词的首字母转为大写形式<br/>';

      echo ucwords("don't play zone defence against the philadelphia 76-ers"), "&nbsp; don't 和 76-ers 被认为是一个单词,所以不会把 t 和 e 转换为大写";

  strtolower或strtoupper: 反整个字符串转换为小写或大写。Tips: 此函数的使用会考虑到本地化的设置。

    例子:

      echo strtolower('My Love Is You!'), '&nbsp; 字符串转换为小写<br/>';

      echo strtoupper('My Love Is You!'), '&nbsp; 字符串转换为大写<br/>';

  ltrim、rtrim或trim: 删除字符串左边、右边或者两边的空白字符,空白字符有:换行符、回车符、空格符、水平和垂直制表符和空值(null); 通过第二个参数可以删除用户指定的字符,首字符与未字符之间用两个点来表示范围,详情请看例子。

    例子:

      echo $trim_str = '444我的前面和后面都有空格,6(中间的数字)!8888', '<br/>';

      echo ltrim($trim_str), '&nbsp; 删除了左边的空格,默认是空格,没有第二个参数<br/>';

      echo rtrim($trim_str), '&nbsp; 删除了右边的,默认是空格,没有第二个参数<br/>';

      echo trim($trim_str), '&nbsp; 删除了两边的,默认是空格,没有第二个参数<br/>';

      echo ltrim($trim_str, ' 0..9'), '&nbsp; 通过第二个参数删除左边空格和0到9的数字<br/>';

      echo rtrim($trim_str, ' 0..9'), '&nbsp; 通过第二个参数删除右边空格和0到9的数字<br/>';

      echo trim($trim_str, ' 0..9'), '&nbsp; 通过第二个参数删除两边空格和0到9的数字<br/>';

  fputcsv: 指定字符分隔数据并保存到CSV文件中

    例子1: 把数据保存到文件

      $arr_fputcsv = array(

        array('2013-01-10', 'ysp01', 111),

        array('2013-02-20', 'ysp02', 222),

        array('2013-02-20', 'ysp02', 222),

        array('2013-02-20', 'ysp02', 222),

      );

      $fh = fopen('sale.csv', 'w') or die(ucfirst("can't open sale.csv"));

      foreach ($arr_fputcsv as $key => $sale_line) {

        if (fputcsv($fh, $sale_line) === false) {

          die(ucfirst("can't write CSV file!"));

        }

      }

      if (fclose($fh)) {

        echo ucfirst('save'), '&nbsp;', strtoupper( 'Success !把数据保存为CSV格式的文件,完成!<br/>');

      } else {

        die(ucfirst("can't clase sale.csv"));

      }

    例子2: 直接使用PHP的输出流(php://output),不保存到文件

      $arr_fputcsv = array(

        array('2013-01-10', 'ysp01', 111),

        array('2013-02-20', 'ysp02', 222),

        array('2013-02-20', 'ysp02', 222),

        array('2013-02-20', 'ysp02', 222),

      );

      $fh = fopen('php://output', 'w') or die(ucfirst("can't open php://output"));

      foreach ($arr_fputcsv as $key => $sale_line) {

        if (fputcsv($fh, $sale_line) === false) {

          die(ucfirst("can't write php://output !"));

        }

      }

      if (fclose($fh)) {

        echo ucfirst('save'), '&nbsp;', strtoupper( 'Success !把数据保存输出流中输出了!<br/>');

      } else {

        die(ucfirst("can't clase php://output"));

      }

    例子3: 把数据保存到一个字符串中,在例2中,已经把数据保存到了输出流中,下面可以通过缓存技术取到数据并保存到字符串中

      $arr_fputcsv = array(

        array('2013-01-10', 'ysp01', 111),

        array('2013-02-20', 'ysp02', 222),

        array('2013-02-20', 'ysp02', 222),

        array('2013-02-20', 'ysp02', 222),

      );

      ob_start();

      $fh = fopen('php://output', 'w') or die(ucfirst("can't open php://output"));

      foreach ($arr_fputcsv as $key => $sale_line) {

        if (fputcsv($fh, $sale_line) === false) {

          die(ucfirst("can't write php://output !"));

        }

      }

      $fputcsv_str = ob_get_clean();

      if (fclose($fh)) {

        echo $fputcsv_str, ucfirst(' save'), '&nbsp;', strtoupper( 'Success !把数据保存到缓存的输出流中,然后保存到字符串!<br/>');

      } else {

        die(ucfirst("can't clase php://output"));

      }

    例子4: 产生一个可下载的CSV文件

      $title = array('Region', 'Start Date', 'End Date', 'Amount');

      $datas = array(

        array('ysp1', '2013-01-11', '2013-11-11', 1111),

        array('ysp2', '2013-12-11', '2013-12-28', 2222),

        array('ysp3', '2015-01-01', '2016-11-11', 3333));

      $output = fopen('php://output', 'w') or die('Can not open php://output !');

      $total = 0;

      header('Content-Type: application/csv'); // 告诉浏览器此文件是CSV文件

      header('Content-Disposition: attachment; filename="sale.csv"'); // 选择浏览器用附件的形式打开

      fputcsv($output, $title);

      foreach ($datas as $key => $sales_line) {

        fputcsv($output, $sales_line);

        $total += $sales_line[3];

      }

      fputcsv($output, array('总计:', '--', '--', $total));

      fclose($output) or die('Can not close php://output !');

  fgetcsv: 从指定的CSV文件中读取数据,最好给个length,速度会快点

    例子1:

      $fh_get = fopen('sale.csv', 'r');

      echo "<table border = 1>\n";

        while ($csv_line = fgetcsv($fh_get)) {

          echo "<tr>\n";

          for ($i=0; $i < count($csv_line); $i++) {

            echo '<td>', htmlspecialchars($csv_line[$i]), '</td>';

          }

          echo "</tr>";

        }

      echo "</table>\n";

      fclose($fh_get) or die("Can't close file !");

  str_pad: 用一个字符串填充另一个字符串到指定的长度,Tips:如果长度为负、小于或等于填充的字符串长度,则原样返回

    例子1:

      echo str_pad('input', 10), '&nbsp; 默认的填充方式,在右边,使用空格填充到10个长度<br/>';

      echo str_pad('input', 10, '~'), '&nbsp; 默认在右边,使用~填充到10个长度<br/>';

      echo str_pad('input', 10, '~', STR_PAD_LEFT), '&nbsp; 在左边,使用~填充到10个长度<br/>';

      echo str_pad('input', 10, '~', STR_PAD_BOTH), '&nbsp; 在两边,使用~填充到10个长度,先右后左<br/>';

  pack、unpack: 这个不好理解啊!Tips:对于a、A、h和H,后面的数字表示这个字符串有多长,

    如:A25 ---> 表示一个25个字符、以空格填充的字符串。其它后面的数字表示相应的类型在字符串中出现的次数,使用*表示其余的现有数据。

    此两个函数的格式化字符:

      a 无填充的字符串

      A 空格填充的字符串

      h 16位字符串,以低4位字节开始

      H 16位字符串,以高4位字节开始

      c 带符号的字符

      C 无符号的字符

      s 带符号的短整型数(16位,计算机字节序列)

      S 无符号的短整型数(16位,计算机字节序列)

      n 无符号的短整型数(16位,big endian字节序列)

      v 无符号的短整型数(16位,little endian字节序列)

      i 带符号的整数(大小与字节序列同计算机相关)

      I 无符号的整数(大小与字节序列同计算机相关)

      l 带符号的长整型(32位,计算机字节序列)

      L 无符号的长整型(32位,计算机字节序列)

      N 无符号的长整型(32位,big endian字节序列)

      V 无符号的长整型(32位,little endian字节序列)

      f 浮点型数(大小和表示法同计算机相关)

      d 双精度型数(大小和表示法同计算机相关)

      x 空字节

      X 倒退一个字节

      @ 绝对位置以空值填充

    例子1:

      $s = 'platypus';

      $ascii = unpack('c*', $s);

      print_r($ascii);

  str_split: 把字符串按指定的长度分割为数组,默认长度为1,Tips:长度为负的,返回false;长度超过string长度就做为一个返回

    例子1:

      echo '默认的分割方式,单字符数组:<br/>';

      var_dump(str_split('Hello world'));

      echo '指定长度分割:<br/>';

      var_dump(str_split('Hello world', 5));

  preg_split: 执行一个正则分割

    例子1:

      echo '正则分割,默认是区分大小写的,可以在正则表达式中添加/i参数来不区分:<br/>';

      var_dump(preg_split('/ x /', '31 inches x 22 inches X 9 inches'));

  wordwrap: 指定长度自动换行

    例子1:

      $wrap_str = <<< WRAP

      Four score and seven years ago out fathers brought forth

      on this continent a new nation, conceived in liberty and

      dedicated to the proposition that all men are createed equal.

      WRAP;

      echo "<pre>使用默认的换行,一行75个字符:<br/>", wordwrap($wrap_str), "<br/></pre>";

      echo "<pre>使用默认的换行(\\n),不过HTML不认,需要用pre标签:<br/>", wordwrap($wrap_str, 30), "<br/></pre>";

      echo "指定长度后,添加换行符:<br/>", wordwrap($wrap_str, 30, "<br/>"), '<br/>';

      echo "超过长度,可以用第4个参数做控制是否换行,默认在一行不自动换:<br/>", wordwrap('abcdefgh', 4), '<br/>';

      echo "超过长度,可以用第4个参数做控制是否换行:<br/>", wordwrap('abcdefgh', 4, '<br/>', 1);

5.在字符串中插入函数或表达式

  5.1 可以把变量、对象的属性、数组元素直接放在双引号中使用,Tips: 此时数组的引用变量不能加引号。

      使用大括号可以引入复杂的表达式。

    例子:

      $children = 6;

      $ob_sub = new stdClass();

      $ob_sub->age = 78;

      $ob = new stdClass();

      $ob->name = 'yangping';

      $ob->children = $ob_sub;

      $arr = array('length' => 999, 888);

      function getMony() {

        return 999;

      }

      class Test1 {

        public function getMony() {

          return 8888;

        }

        public static function getCount() {

          return 777;

        }

      }

      $t = new Test1();

      function getMony1() {

        return 666;

      }

      echo "I have $children children", '&nbsp; 取变量值<br/>';

      echo "My name is $ob->name", '&nbsp; 取对象属性值,这个值不能再指定下一级<br/>';

      echo "Array length is $arr[length]", '&nbsp; 数组索引不能加引号,不推荐这样使用,因为$arr[\'length\']的效率比$arr[length]快<br/>';

      echo '字符串中添加复杂表达式,Tips:在上面的取值中,也可以直接用大括号包起来取<br/>';

      echo "I have {$children} children", '&nbsp; 使用大括号取变量值<br/>';

      echo "My name is {$ob->name}", '&nbsp; 取对象属性值';

      echo "My name is {$ob->children->age}", '&nbsp; 使用大括号取对象属性值,可以取到下一级<br/>';

      echo "Array length is {$arr['length']}", '&nbsp; 使用大括号取数组索引值,索引添加引号<br/>';

      echo "My money 1 {getMony1()}", '&nbsp; 使用大括号直接访问方法,<font color=red>错误</font>,取不到值<br/>';

      echo "My money 2 {$t->getMony()}", '&nbsp; 使用大括号取对象中的方法返回值,Tips:非静态方法只能用 -> <br/>';

      echo "My money 3 {$t::getCount()}", '&nbsp; 使用大括号取对象中的方法返回值,Tips:静态方法可以用 -> 也可以用 :: 来访问<br/>'

你可能感兴趣的:(PHP 字符操作学习记录)