从字符串的开头删除一个字符串

Ale*_*lex 130 php string

我有一个看起来像这样的字符串:

$str = "bla_string_bla_bla_bla";
Run Code Online (Sandbox Code Playgroud)

我怎样才能删除第一个bla_; 但只有在字符串的开头找到它?

随着str_replace(),它删除了所有 bla_的.

Fab*_*ora 315

普通形式,没有正则表达式:

$prefix = 'bla_';
$str = 'bla_string_bla_bla_bla';

if (substr($str, 0, strlen($prefix)) == $prefix) {
    $str = substr($str, strlen($prefix));
} 
Run Code Online (Sandbox Code Playgroud)

需要:0.0369毫秒(0.000,036,954秒)

与:

$prefix = 'bla_';
$str = 'bla_string_bla_bla_bla';
$str = preg_replace('/^' . preg_quote($prefix, '/') . '/', '', $str);
Run Code Online (Sandbox Code Playgroud)

注意到:0.1749毫秒(0.000,174,999秒)第一次运行(编译),和0.0510毫秒(0.000,051,021秒)之后.

显然,在我的服务器上描述.

  • @salathe,我不明白.提出了基于惯用语和正则表达式的解决方案:在效率方面比较两者有助于找到最佳(再次在效率方面)答案.为什么那么邪恶? (51认同)
  • 我从来没有见过三元运算符滥用如此糟糕,一个简单的`if(condition){statement}`会更加清晰. (8认同)
  • @cbrandolino,没有人说这是邪恶的*.我只是觉得这个问题完全无关紧要; 很像"这里有两个解决方案,而这里有一些小猫的照片可供更多的投票". (5认同)
  • @salathe:我接受批评.看到最快的是个人的好奇心. (4认同)
  • `if(substr($ str,0,strlen($ prefix))== $ prefix)`可以改为`if(0 === strpos($ str,$ prefix))`以避免不必要的内存分配相同的可读性:) (4认同)
  • 从 php 8.0 开始,您可以使用 `str_starts_with()` 而不是 `substr..` 构造...:https://www.php.net/manual/de/function.str-starts-with.php (4认同)
  • @salathe小猫根本不相关**,分析(边缘)是.他甚至没有基于他的分析加权答案,只是客观地补充说明.*据说*,给出两个相同的答案,一个**与小猫**,一个没有;**我会投票给小猫,谁不会?**:P (3认同)
  • 为什么没有人使用 `ltrim($str, $prefix)` ? (2认同)

Tat*_*nen 54

您可以使用带有插入符号(^)的正则表达式,它将匹配锚定到字符串的开头:

$str = preg_replace('/^bla_/', '', $str);
Run Code Online (Sandbox Code Playgroud)

  • 我认为这对程序员来说不那么痛苦并且更直观。即使它在性能上输给了另一个建议的解决方案(我真的很怀疑),我仍然更喜欢这个。 (2认同)

Pav*_*vel 17

function remove_prefix($text, $prefix) {
    if(0 === strpos($text, $prefix))
        $text = substr($text, strlen($prefix)).'';
    return $text;
}
Run Code Online (Sandbox Code Playgroud)

  • 不需要`.''` (9认同)

小智 14

在 PHP 8+ 中,我们可以简化使用该str_starts_with()函数:

$str = "bla_string_bla_bla_bla";
$prefix = "bla_";
if (str_starts_with($str, $prefix)) {
  $str = substr($str, strlen($prefix));
}
Run Code Online (Sandbox Code Playgroud)

https://www.php.net/manual/en/function.str-starts-with.php

编辑:修复了示例代码中的拼写错误(右括号)。


Ste*_*bos 7

这是一种更快的方法:

// strpos is faster than an unnecessary substr() and is built just for that 
if (strpos($str, $prefix) === 0) $str = substr($str, strlen($prefix));
Run Code Online (Sandbox Code Playgroud)


cbr*_*ino 5

这里.

$array = explode("_", $string);
if($array[0] == "bla") array_shift($array);
$string = implode("_", $array);
Run Code Online (Sandbox Code Playgroud)

  • 测量0.0000459153秒:) (2认同)