【问题标题】:How to get everything after a certain character?如何获得某个角色之后的所有内容?
【发布时间】:2012-07-09 11:13:42
【问题描述】:

我有一个字符串,我想在某个值之后获取所有内容。字符串总是以一组数字开始,然后是一个下划线。我想在下划线之后得到字符串的其余部分。例如,如果我有以下字符串以及我想要返回的内容:

"123_String" -> "String"
"233718_This_is_a_string" -> "This_is_a_string"
"83_Another Example" -> "Another Example"

我该怎么做这样的事情?

【问题讨论】:

    标签: php string


    【解决方案1】:

    使用此行返回符号后面的字符串,如果字符不出现则返回原始字符串:

    $newString = substr($string, (strrpos($string, '_') ?: -1) +1);
    

    【讨论】:

      【解决方案2】:

      如果您想在某些字符之后获取所有内容,并且这些字符位于字符串的开头,您可以使用更简单的解决方案,如下所示:

      $value = substr( '123_String', strlen( '123_' ) );
      echo $value; // String
      

      【讨论】:

        【解决方案3】:

        我使用 strrchr()。例如,要查找文件的扩展名,我使用此函数:

        $string = 'filename.jpg';
        $extension = strrchr( $string, '.'); //returns "jpg"
        

        【讨论】:

        • $extension = substr(strrchr($string, '.'), 1); // 返回“jpg”
        【解决方案4】:

        这里是使用explode的方法:

        $text = explode('_', '233718_This_is_a_string', 2)[1]; // Returns This_is_a_string
        

        或:

        $text = end((explode('_', '233718_This_is_a_string', 2)));
        

        通过为explode() 中的limit 参数指定2,它返回由字符串分隔符分隔的最多2 个元素的数组。返回第二个元素 ([1]),将给出字符串的其余部分。


        这是另一个使用strpos 的单行代码(如@flu 所建议的那样):

        $needle = '233718_This_is_a_string';
        $text = substr($needle, (strpos($needle, '_') ?: -1) + 1); // Returns This_is_a_string
        

        【讨论】:

        • 消音器@ 是一种糟糕的编码习惯。错误被静音,但错误不断被记录。您的磁盘将满。
        【解决方案5】:

        另一种简单的方法,使用strchr()strstr()

        $str = '233718_This_is_a_string';
        
        echo ltrim(strstr($str, '_'), '_'); // This_is_a_string
        

        在您的情况下,单独使用 ltrim() 就足够了:

        echo ltrim($str, '0..9_'); // This_is_a_string
        

        但前提是字符串的右边部分(_之后)不以数字开头,否则也会被剪掉。

        【讨论】:

          【解决方案6】:

          strtok 是这类事情的一个被忽视的功能。它应该是相当快的。

          $s = '233718_This_is_a_string';
          $firstPart = strtok( $s, '_' );
          $allTheRest = strtok( '' ); 
          

          这样的空字符串将强制返回字符串的其余部分。

          注意,如果在 '_' 之后什么都没有,你会得到 $allTheRestFALSE 值,正如 documentation 中所述,必须使用 === 进行测试,以区别于其他虚假价值观。

          【讨论】:

          • 注意:如果字符串中的第一个字符,strtok 将返回字符串之后字符的部分,例如strtok('a_b', '_') 将返回a 但是strtok('_b', '_') 将返回 b,而不是您期望的空字符串
          • 嗯,这个评论,我想我不会“期望”一个空字符串,我可能会想知道我是否会得到一个空字符串...
          • 我的评论是试图说如果_ 是第一个字符,这个答案将会中断。如果上面代码中的$s"_This_is_a_string",则结果将是is_a_string,而不是This_is_a_string。因此,它不是针对每种情况的“如何获取某个字符之后的所有内容?”的解决方案。
          【解决方案7】:
          $string = "233718_This_is_a_string";
          $withCharacter = strstr($string, '_'); // "_This_is_a_string"
          echo substr($withCharacter, 1); // "This_is_a_string"
          

          在一个单一的声明中。

          echo substr(strstr("233718_This_is_a_string", '_'), 1); // "This_is_a_string"
          

          【讨论】:

            【解决方案8】:

            如果有人需要提取字符串的第一部分,那么可以尝试,

            查询:

            $s = "This_is_a_string_233718";
            
            $text = $s."_".substr($s, 0, strrpos($s, "_"));
            

            输出:

            This_is_a_string

            【讨论】:

              【解决方案9】:

              strpos() 查找下划线的偏移量,然后 substr 获取从该索引加 1 开始的所有内容。

              $data = "123_String";    
              $whatIWant = substr($data, strpos($data, "_") + 1);    
              echo $whatIWant;
              

              如果您还想在尝试获取之前检查字符串中是否存在下划线字符 (_),可以使用以下命令:

              if (($pos = strpos($data, "_")) !== FALSE) { 
                  $whatIWant = substr($data, $pos+1); 
              }
              

              【讨论】:

              • 检查下划线是否存在的最佳方法是什么,例如它是可选的。
              • @JohnMagnolia:那你就用if (($pos = strpos($data, "_")) !== FALSE) { $whatIWant = substr($data, $pos+1); }
              • @JohnMagnolia 或者有点花哨的单行:substr($data, (strrpos($data, '_') ?: -1) +1)
              • @flu 我想你的意思是,更难阅读。 IMO,更少的线条并不意味着更好。
              • 此函数将在某些子字符串/字符之后返回字符串,如果没有找到针,则返回 false:function StrAfterStr($S, $H) { return (($P = strpos($S, $H)) !== false) ? substr($S, $P + 1) : false; }
              猜你喜欢
              • 2020-10-06
              • 1970-01-01
              • 1970-01-01
              • 2011-03-12
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多