【问题标题】:Add substring at beginning of string if doesn't exist (php)如果不存在,则在字符串开头添加子字符串(php)
【发布时间】:2019-06-20 16:21:25
【问题描述】:

我想在字符串开头添加一个子字符串(文本),前提是该字符串在开头没有此文本。

我对最快的解决方案感兴趣。

例子:

// let's say I want to add "Has" at beginning (if doesn't exist)

$string_1 = "AnaHasSomeApples"; // we need to add
$string_1 = "HsSomeApples"; // we need to add
$string_2 = "HasApplesAlready"; // already exists at the beginning

我试过了:

$string = (strpos($string, 'Has') === false ? 'Has' : '') . $string;

我知道这样做并不难。但我想要最快(根据时间,而不是代码行)可能的方式。 谢谢。

【问题讨论】:

  • 你试过什么?
  • 无论您做什么,您都在考虑 O(n) 最坏情况的复杂性,因此您所做的任何事情或多或少都会表现得相当。
  • 看起来您尝试的只是检查字符串中的任何位置,而不仅仅是在开头。
  • 你是对的。我的错。
  • 字符串连接是这里的繁重操作,也是你无法避免的操作。这样做是将第一个字符串逐字节复制到新的内存位置,然后在第一个字符串之后逐字节复制第二个字符串。与此相比,检查字符串是否以某些东西开头非常快

标签: php string substring


【解决方案1】:

您可以尝试这种方式 - 检查前 3 个字符是否不等于“Has”,如果有,则只需使用 $string_1 else 将“Has”与它连接。

$string_1 = (substr( $string_1 , 0, 3 ) !== "Has") ? "Has".$string_1 : $string_1;
echo $string_1;

如果您希望“必须”不区分大小写,则可以在使用条件检查时使用strtolower

演示: https://3v4l.org/QEr1l

【讨论】:

    【解决方案2】:

    我正在检查 Has 是否不在位置 0,然后在 'Has' 前面加上现有字符串
    您可以使用三元运算符来实现这一点,

    $string_1 = "AnaHasSomeApples"; // we need to add
    $string_2 = "HsSomeApples"; // we need to add
    $string_3 = "HasApplesAlready"; // already exists at the beginning
    
    echo "string_1: ". (strpos($string_1,"Has") !== 0 ? "Has".$string_1: $string_1)."\n";
    echo "string_2: ". (strpos($string_2,"Has") !== 0 ? "Has".$string_2: $string_2)."\n";
    echo "string_3: ". (strpos($string_3,"Has") !== 0 ? "Has".$string_3: $string_3)."\n";
    

    输出

    string_1: HasAnaHasSomeApples
    string_2: HasHsSomeApples
    string_3: HasApplesAlready
    

    Demo.

    【讨论】:

      【解决方案3】:

      您可能会喜欢这个解决方案:

      首先从主字符串中修剪你想要的字符串,确保主字符串的开头不存在该字符串,然后尝试在原始字符串的开头添加你想要的字符串。

      $string = 'HasSomeApples';
      
      $result = 'Has' . ltrim($string, 'Has');
      

      【讨论】:

        猜你喜欢
        • 2015-07-05
        • 1970-01-01
        • 2022-08-18
        • 1970-01-01
        • 2020-02-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-27
        相关资源
        最近更新 更多