【问题标题】:Remove everything from the first occurrence of a character to the end of a string in PHP在 PHP 中删除从第一次出现的字符到字符串结尾的所有内容
【发布时间】:2010-11-11 00:15:33
【问题描述】:

我想从 PHP 中字符串的第一个逗号中删除所有内容(包括逗号)。

例如,

$print = "50 days,7 hours";

应该变成

50 days

【问题讨论】:

    标签: php replace substring extract


    【解决方案1】:

    这是一种方法:

    $print = preg_replace('/^([^,]*).*$/', '$1', $print);
    

    另一个:

    list($print) = explode(',', $print);
    

    或者:

    $print = explode(',', $print)[0];
    

    【讨论】:

    • 对于简单的字符串操作来说,正则表达式似乎有点矫枉过正?
    • 正则表达式有点像蚊子问题的经典解决方案
    • 我喜欢你的第二个例子。这是一种巧妙的解决方法,您不能使用explode(',', $print)[0]。我会使用 array_shift,但我更喜欢列表的想法。
    • 如果字符串不包含逗号,我希望它能够工作.....我采用了您的第二个解决方案......非常感谢
    【解决方案2】:

    这应该适合你:

    $r = (strstr($print, ',') ? substr($print, 0, strpos($print, ',')) : $print);
    # $r contains everything before the comma, and the entire string if no comma is present
    

    【讨论】:

    • 这个工作例如给定,但如果字符串不包含逗号会失败。
    • php 手册指出,出于性能原因,不应使用strstr() 来寻找字符串中是否存在子字符串。 php.net/manual/en/….
    【解决方案3】:

    您可以使用正则表达式,但如果它总是与逗号配对,我会这样做:

    
    $printArray = explode(",", $print);
    $print = $printArray[0];
    

    【讨论】:

    • 你不是说 $printArray[0] 吗?
    【解决方案4】:

    你也可以使用current函数:

    $firstpart = current(explode(',', $print)); // will return current item in array, by default first
    

    还有该系列的其他功能:

    $nextpart = next(explode(',', $print)); // will return next item in array
    
    $lastpart = end(explode(',', $print)); // will return last item in array
    

    【讨论】:

      【解决方案5】:
      $string="50 days,7 hours";  
      $s = preg_split("/,/",$string);
      print $s[0];
      

      【讨论】:

      • 我无法想象为什么这被否决了。对反对的选民,愿意解释一下吗?
      • 可能是因为你使用了 preg_split() 有点矫枉过正?
      • 是的,我认为投反对票是不公平的。这可能是矫枉过正且效率低下,但它确实有效。 PHP 手册说“如果您不需要正则表达式的强大功能,您可以选择更快(尽管更简单)的替代方法,例如 explode() 或 str_split()”
      • >> 这可能是矫枉过正且效率低下,但这并不重要。不要成为一个速度小子:)
      • 我想说这个仅代码的答案展示了“两个世界中最糟糕的”。它使用正则表达式来处理不需要正则表达式的任务(在文字字符串上拆分是explode() 的设计目的)并且它在最终需要字符串时生成一个数组.调用中甚至没有限制参数,因此它可能会在返回的数组中生成许多元素。我知道这是一个古老的问题,但我看不到这种技术的任何可取之处。它有效,但我永远不会推荐它。
      【解决方案6】:

      如果您要使用strstr(),那么您需要100% 确定字符串中存在逗号,或者准备好处理false 返回值。将其第三个参数设置为true 以访问第一个逗号之前的所有字符。如果没有逗号,则返回值为false

      preg_replace() 可能效率最低,但它是单个函数调用,如果找不到逗号,我将使用的模式不会改变字符串。如果您的输入字符串中可能包含换行符,请使用 s 模式修饰符以允许点 (.) 也匹配这些字符。

      strtok() 是一个简洁易用的工具,但我发现它的名称比其他功能更不具表现力/更神秘(也许这是我个人对strstr() 的偏见。这可能会使未来的读者感到困惑或减慢您的代码。如果输入字符串没有长度,此函数将返回 false

      如果你要使用explode(),那么不要要求php执行超过1次爆炸。这个函数的好处是如果逗号不存在,那么它将返回整个字符串。我不喜欢使用explode(),因为它会生成一个数组,从中可以访问第一个元素——我不喜欢生成比我需要的更多的数据。

      sscanf() 对于这个任务来说有点笨拙,因为需要使用否定字符类以及空合并运算符。如果分隔符是空格,则可以使用 %s,但仍需要空值合并运算符,因为 sscanf() 不会进行零长度匹配。

      代码:(Demo) (Demo if no comma) (Demo if string empty)

      "50 days,7 hours" "50 days" ""
      strstr($print, ',', true) "50 days,7 hours" false false
      preg_replace('/,.*/', '', $print) "50 days,7 hours" "50 days" ""
      strtok($print, ",") "50 days,7 hours" "50 days" false
      explode(',', $print, 2)[0] "50 days,7 hours" "50 days" ""
      sscanf($print, '%[^,]')[0] ?? $print "50 days,7 hours" "50 days" ""

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-14
        • 1970-01-01
        相关资源
        最近更新 更多