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

我有一个这样的字符串:

$str = "bla_string_bla_bla_bla";

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

str_replace(),它删除 所有 bla_的。

172052 次浏览

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

$str = preg_replace('/^bla_/', '', $str);

给你。

$array = explode("_", $string);
if($array[0] == "bla") array_shift($array);
$string = implode("_", $array);

纯形式,没有 regex:

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


if (substr($str, 0, strlen($prefix)) == $prefix) {
$str = substr($str, strlen($prefix));
}

拍摄时间: 0.0369毫秒(0.000.036,954秒)

还有:

$prefix = 'bla_';
$str = 'bla_string_bla_bla_bla';
$str = preg_replace('/^' . preg_quote($prefix, '/') . '/', '', $str);

拍摄时间: 第一次运行(编译)时的 0.1749毫秒(0.000,174,999秒)和之后的 0.0510毫秒(0.000.051,021秒)。

显然是在我的服务器上。

我认为 subr _ place 可以实现您想要的功能,在这里您可以将替换限制为字符串的一部分: Http://nl3.php.net/manual/en/function.substr-replace.php (这将使您只能查看字符串的开头)

您可以使用 str _ place (http://nl3.php.net/manual/en/function.str-replace.php)的 count 参数,这将允许您从左边开始限制替换的数量,但是它不会强制从左边开始。

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

速度很快,但是这是硬编码的,不能依赖于以 _ 结尾的指针。有通用版本吗?6月29日23:26

一般的说法是:

$parts = explode($start, $full, 2);
if ($parts[0] === '') {
$end = $parts[1];
} else {
$fail = true;
}

一些基准:

<?php


$iters = 100000;
$start = "/aaaaaaa/bbbbbbbbbb";
$full = "/aaaaaaa/bbbbbbbbbb/cccccccccc/dddddddddd/eeeeeeeeee";
$end = '';


$fail = false;


$t0 = microtime(true);
for ($i = 0; $i < $iters; $i++) {
if (strpos($full, $start) === 0) {
$end = substr($full, strlen($start));
} else {
$fail = true;
}
}
$t = microtime(true) - $t0;
printf("%16s : %f s\n", "strpos+strlen", $t);


$t0 = microtime(true);
for ($i = 0; $i < $iters; $i++) {
$parts = explode($start, $full, 2);
if ($parts[0] === '') {
$end = $parts[1];
} else {
$fail = true;
}
}
$t = microtime(true) - $t0;
printf("%16s : %f s\n", "explode", $t);

在我相当老旧的家用电脑上:

$ php bench.php

产出:

   strpos+strlen : 0.158388 s
explode : 0.126772 s

这里有一个更快的方法:

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

这里有很多不同的答案。似乎都是基于字符串分析。下面是我使用 PHP explode将字符串分解为两个值的数组,并且只返回第二个值:

$str = "bla_string_bla_bla_bla";
$str_parts = explode('bla_', $str, 2);
$str_parts = array_filter($str_parts);
$final = array_shift($str_parts);
echo $final;

产出将包括:

string_bla_bla_bla

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

$str = "bla_string_bla_bla_bla";
$prefix = "bla_";
if (str_starts_with($str, $prefix) {
$str = substr($str, strlen($prefix));
}

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