【问题标题】:how to remove last occurance of underscore in string如何删除字符串中最后出现的下划线
【发布时间】:2013-05-29 07:42:20
【问题描述】:

我有一个字符串,其中包含许多下划线,后跟单词 ex:“Field_4_txtbox”我需要找到字符串中的最后一个下划线并删除它后面的所有内容(包括“_”),所以它会返回给我"Field_4" 但我需要它来处理不同长度的结尾字符串。所以我不能只修剪固定的长度。

我知道我可以做一个 If 语句来检查某些结尾,例如

if(strstr($key,'chkbox')) {
    $string= rtrim($key, '_chkbox');
}

但我想用正则表达式模式一次性完成,我该如何完成?

【问题讨论】:

    标签: php regex


    【解决方案1】:

    匹配的正则表达式是:

    /_[^_]*$/
    

    只需将其替换为 '':

    preg_replace( '/_[^_]*$/', '', your_string );
    

    【讨论】:

      【解决方案2】:

      没有必要使用极其昂贵的正则表达式,一个简单的 strrpos() 就可以完成这项工作:

      $string=substr($key,0,strrpos($key,"_"));
      

      strrpos — 查找字符串中子字符串最后次出现的位置

      【讨论】:

      • 我认为这会找到第一次出现的下划线。
      • @Robbert - 我使用的是 strrpos,而不是 strpos(注意额外的 r),它会反向搜索。
      • 主要的一点是避免使用极其昂贵的正则表达式来进行廉价的字符串反向搜索,这在几次比较之后就会成功。
      • @Eugen 巧妙使用 strrpos +1
      • @EugenRieck 我编辑了您的答案,以更清楚地表明您正在使用strrpos()
      【解决方案3】:

      你也可以只用explode():

      $string = 'Field_4_txtbox';
      $temp = explode('_', strrev($string), 2);
      $string = strrev($temp[1]);
      echo $string;
      

      自 PHP 5.4+ 起

      $string = 'Field_4_txtbox';
      $string = strrev(explode('_', strrev($string), 2)[1]);
      echo $string;
      

      【讨论】:

      • 这比 preg_replace 快吗?
      • @Undermine2k 我不知道,但我知道我们正在谈论微优化。所以你最好选择“可读代码”。我个人认为preg_replace() 更具可读性,我只是想提供另一种解决方案:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-15
      • 2018-05-18
      • 1970-01-01
      • 2012-10-12
      • 2012-06-05
      • 2019-12-22
      相关资源
      最近更新 更多