我有一个这样的字符串:
$str = "bla_string_bla_bla_bla";
如何删除第一个 bla_; 但只有在字符串的开头才能找到它?
bla_
与 str_replace(),它删除 所有 bla_的。
str_replace()
可以使用带插入符号(^)的正则表达式,它将匹配锚定到字符串的开头:
^
$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将字符串分解为两个值的数组,并且只返回第二个值:
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_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