zoukankan      html  css  js  c++  java
  • 常用的PHP字符串操作函数

    1.strlen

     

     但是要注意!如果字符串中是汉字等其他字符时候呢?

    $str = "我";
    echo strlen($str); //一个汉字,在UTF8格式下,显示3, ANSI格式下显示2

    这样一来,不符合人的自然感觉,于是,有个升级版的函数

    2. mb_strlen

    1 $str = "我";
    2 echo mb_strlen($str,'utf-8'); //1

    要加上第二个参数才行,对待 等转义字符上同strlen一样,视同一个字符

    3. strpos  查找字符串$needle字符串$haystack首次出现的位置 

    stripos和strpos类似,区别是stripos不区分大小写

    strrpos和strpos类似,区别是strrpos是找最后一次出现的位置

    strripos和strrpos类似,区别是它不区分大小写

    a needle in a haystack 草垛里的针,needle是针,haystack草垛。就是在草垛里找缝衣针的意思。

        mixed  strpos  ( string $haystack  , mixed  $needle  [, int $offset  = 0  ] )

    所以,了解英语意思的话,很容易知道怎么去用。查找返回int类型位置,如果没找到返回bool值false

    注意几点:

    3.1.位置是从0开始的

    //位置是从0开始的,a在 abc的 第0个位置
    var_dump(     strpos('abc','a')   ); //int 0

    3.2. 位置都是指的头部的位置

    //位置是从needle的头部开始算
    //bc 首次出现在 abcbc 的位置,索引是1
    var_dump(   strpos('abcbc', 'bc')   ); //int 1

    3.3. 第三个参数$offset指定了从什么位置开始找,默认是0,就是从头开始找,指定位置不能为负数

    //指定查找位置为2,也就是第一个c出现的位置,从c的位置(含c)开始往后找bc,bc第一次出现的位置就是3
    $str = "abcbc";
    var_dump( strpos($str,'bc',2) ); //int 3

    3.4.处理汉字的时候出现位置的错误,和strlen判断汉字长度类似

    //字符串中带汉字等
    //utf-8下,一个汉字占了3个位置
    $str = "a我是中国人bc";
    var_dump(strpos($str,'是中')); //int 4 

    4.str_replace

    mixed  str_replace  ( mixed  $search  , mixed  $replace  , mixed  $subject  [, int &$count  ] )

     4.1  所有参数都是字符串的时候,很容易理解:把$search替换成$replace,唯一要注意的是,最后那个可选参数$count,并不是你设置个1,它就替换1次,设置2,就替换2次,而是替换完成后,系统把次数赋值给$count!这个数不是你能设置的!

    4.2  替换发生后,$subject的值并没有变,只有$subject = str_replace(...);这样$subject才会变为替换后的结果。

    4.3 当$search是数组,$replace是字符串时,替换的对应关系是:$search每一项都对应$replace

     4.4 $search是字符串,$replace是数组时,都替换成Array了,不要这么用,如下图

    4.5  $search和$replace都是数组的时候,是一一对应的关系,长短不一致时,看下图

     

     4.6 $subject可以是字符串,也可以是一维数组,是数组的话,每一子项都会查找替换。如果是数组中包含数组那种,则不替换(不工作了!)

     都是替换,str_replace在查找项和替换项都是数组的时候,我们知道是一项一项的过,导致的结果:1,替换是分过程的,有先后顺序的,第n次替换对第n+1次替换有影响。

    举个例子:

     1     $search  = array('男人','女人');
     2     $replace = array('女人','男人');
     3     $subject = '男人有钱就变坏,女人变坏就有钱';
     4     /*
     5     原句是:男人有钱就变坏,女人变坏就有钱
     6     想换成:女人有钱就变坏,男人变坏就有钱
     7     却得到:男人有钱就变坏,男人变坏就有钱
     8     */
     9     $new_subject = str_replace($search,$replace,$subject,$count);
    10     echo $new_subject; //男人有钱就变坏,男人变坏就有钱
    11     echo $count; //3
    12     /*
    13     结果显示:男人有钱就变坏,男人变坏就有钱
    14     怎么结果里都是男人?
    15     因为str_replace替换是分过程的,第n步的替换结果影响第n+1步的匹配情况。
    16     第1步:找数组对应第1项,也就是男人换成女人,于是:女人有钱就变坏,女人变坏就有钱
    17     第2步:找数组对应第2项,也就是女人换成男人,于是:男人有钱就变坏,男人变坏就有钱
    18     结束:替换了3次
    19     */

    但是strtr就不一样了!

     1     /*
     2     strtr 替换(注意,不是strtr,我一直以为是strstr)
     3     用法1:string strtr  ( string $str  , string $from  , string $to  )
     4     strstr比较变态的,不符合直觉的地方是,不把$from和$to当成一个字符串,而是分割开来看,具体看下面的例子。
     5     */
     6     echo strtr('男人有钱就变坏,女人变坏就有钱','男孩','女'); //女人有钱就变坏,女人变坏就有钱
     7     /*
     8     上面这一句,
     9     我想是这样的:从句子【男人有钱就变坏,女人变坏就有钱】中找到所有的【男孩】并替换成【女】,于是,没有找到【男孩】,于是没有替换!
    10     但是,这是错误的!这个函数违反直觉的地方,它是下面这样工作的:
    11     把【男孩】分割开,【女】分割开,再$from[$n]和$to[$n]对应起来,对应不上的,扔了。于是,男=》女,孩对应不上,扔了
    12     结果就是【女人有钱就变坏,女人变坏就有钱】
    13     */
    14     echo '<br>';
    15     echo strtr('男人有钱就变坏,女人变坏就有钱','男女','女男'); 
    16     /*
    17     上面这一句,
    18     吸收了上上次的经验,我觉得是男=》女,女=》男,我知道它不像str_replace那样,分步骤来替换,而是同时替换。
    19     这样实现的目的是:【女人有钱就变坏,男人变坏就有钱】
    20     但是现实是:     【女人有钱簱珘睏,男人珘睏簱有钱】
    21     是的!!!!出现了奇怪的结果,奇怪的文字,查了下,文档中strtr没有写是二进制安全的!我也不清楚会有什么结果了。
    22     */
    23 
    24     /*
    25     strtr的用法2相对安全点,我也没有进行其他测试,欢迎留言指出问题
    26     用法2:string strtr  ( string $str  , array $replace_pairs  )
    27     $replace_pairs是数组的形式的替换规则,也就是from->to
    28     因为strtr的第一种用法违反直觉,导致很容易有疑问,数组的键值和内容必须一样吗?数组的每一项键值和内容是当成整体来替换,还是再分隔开对应?
    29     答:经测试:1.数组的键值和内容并不一定相同 2.数组的每一项键值和内容都是看成一个整体的
    30     这样来想,strtr的第一种用法,何尝不是把字符串$from和$to分割成数组呢?第2种用法是直接给个数组,自然不再分割了。
    31     同时,需要注意的是,与str_replace不同,它不是分步骤的替换
    32 
    33     */
    34 
    35     echo '<br>';
    36 
    37     echo strtr('男人女人',array(
    38         '男'=>'女', 
    39         '女'=>'男'
    40         )
    41     ); //女人男人
    42     /*
    43     上面,如果是str_replace来操作的话,第一步,男变成女,于是,女人女人,第2步,女换成男,于是男人男人
    44     而strtr来操作,就是【男人女人】中男变成女同时女变成男,一步操作就搞定。结果就是【女人男人】
    45     */
    46     echo '<br>';
    47     echo strtr('男人女神',array(
    48         '男神'=>'女', 
    49         '女'=>'男'
    50         )
    51     ); //男人男神
    52     /*
    53     上面,strtr的数组中,键值和内容都是一个整体哦!
    54     于是,男神没有匹配的,女人替换成男,于是【男人女人】变成【男人男神】
    55     */

     5.截取子字符串substr

    string substr  ( string $string  , int $start  [, int $length  ] )

    substr在utf-8编码下,截取汉字会乱码哦!

    1     header("Content-type:text/html;charset=UTF-8");
    2 
    3     $str = '我学php';
    4     var_dump(substr($str,0,3)); //我,utf-8下,一个汉字3个字节
    5     echo '<br>';
    6     var_dump(substr($str,1,3));//乱码

    mb_substrsubstr相比,可以用第4个参数指定编码,是按照字符数截取的,解决了汉字乱码问题。

     1 <?php
     2     header("Content-type:text/html;charset=UTF-8");
     3 
     4     $str = '我学php';
     5     var_dump(substr($str,0,3)); //我,utf-8下,一个汉字3个字节
     6     echo '<br>';
     7     var_dump(substr($str,1,3));//乱码
     8     echo '<br>';
     9     var_dump(mb_substr($str,1,null,'utf-8')); //学php
    10 ?>

    6.把字符串通过分割符拆成数组explode

    把数组再粘连成字符串用implode

    array explode  ( string $delimiter  , string $string  [, int $limit  ] )

    如果$limit是正数,则返回的数组包含最多 limit 个元素,而最后那个元素将包含 string 的剩余部分。

    如果 $limit 是负数,则返回除了最后的 -limit 个元素外的所有元素。

    如果 limit 是 0,则会被当做 1。

    如果 delimiter 为空字符串(""), explode() 将返回 FALSE 。 如果 delimiter 所包含的值在 string 中找不到,并且使用了负数的 limit , 那么会返回空的 array , 否则返回包含 string 单个元素的数组。 

     implode把数组再合成字符串

     

    收到

  • 相关阅读:
    Git
    Git
    Git
    Git
    Docker
    Linux
    Linux
    Python
    Python
    SQL
  • 原文地址:https://www.cnblogs.com/html55/p/10777070.html
Copyright © 2011-2022 走看看