我有一个字符串,看起来像这样:
$str = "bla_string_bla_bla_bla";
如何删除第一个bla_;但前提是它出现在字符串的开头对于str_replace(),它删除 * 所有 * bla_的。
bla_
str_replace()
bmvo0sr51#
普通格式,不带正则表达式:
$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秒)。很明显,是在我的服务器上。
ycl3bljg2#
您可以使用带有插入符号(^)的正则表达式,将匹配定位到字符串的开头:
^
$str = preg_replace('/^bla_/', '', $str);
9vw9lbht3#
function remove_prefix($text, $prefix) { if(0 === strpos($text, $prefix)) $text = substr($text, strlen($prefix)).''; return $text; }
lrl1mhuk4#
下面是一个更快的方法:
// strpos is faster than an unnecessary substr() and is built just for that if (strpos($str, $prefix) === 0) $str = substr($str, strlen($prefix));
k5hmc34c5#
给你。
$array = explode("_", $string); if($array[0] == "bla") array_shift($array); $string = implode("_", $array);
k10s72fa6#
速度不错,但是这是硬编码的,取决于以_结尾的指针。有通用版本吗?- toddmo Jun 29 at 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);
在我相当旧的家用PC上:
$ php bench.php
输出:
strpos+strlen : 0.158388 s explode : 0.126772 s
gopyfrb37#
这里有很多不同的答案。看起来都是基于字符串分析的。下面是我对这个问题的看法。我使用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
3df52oht8#
在PHP 8+中,我们可以使用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编辑:修正了示例代码中的一个拼写错误(右括号)。
vddsk6oq9#
我认为substr_replace可以满足你的需要,你可以将替换限制在字符串的一部分:http://nl3.php.net/manual/en/function.substr-replace.php(这将使您能够只查看字符串的开头。)您可以使用str_replace(http://nl3.php.net/manual/en/function.str-replace.php)的count参数,这将允许您限制替换的数量,从左侧开始,但不会强制它位于开头。
9条答案
按热度按时间bmvo0sr51#
普通格式,不带正则表达式:
耗时:0.0369毫秒(0.000,036,954秒)
以及:
耗时:第一次运行(编译)时0.1749毫秒(0.000,174,999秒),之后0.0510毫秒(0.000,051,021秒)。
很明显,是在我的服务器上。
ycl3bljg2#
您可以使用带有插入符号(
^
)的正则表达式,将匹配定位到字符串的开头:9vw9lbht3#
lrl1mhuk4#
下面是一个更快的方法:
k5hmc34c5#
给你。
k10s72fa6#
速度不错,但是这是硬编码的,取决于以_结尾的指针。有通用版本吗?- toddmo Jun 29 at 23:26
一般版本:
一些基准:
在我相当旧的家用PC上:
输出:
gopyfrb37#
这里有很多不同的答案。看起来都是基于字符串分析的。下面是我对这个问题的看法。我使用PHP
explode
将字符串分解成正好两个值的数组,并只返回第二个值:输出将为:
3df52oht8#
在PHP 8+中,我们可以使用
str_starts_with()
函数来简化:https://www.php.net/manual/en/function.str-starts-with.php
编辑:修正了示例代码中的一个拼写错误(右括号)。
vddsk6oq9#
我认为substr_replace可以满足你的需要,你可以将替换限制在字符串的一部分:http://nl3.php.net/manual/en/function.substr-replace.php(这将使您能够只查看字符串的开头。)
您可以使用str_replace(http://nl3.php.net/manual/en/function.str-replace.php)的count参数,这将允许您限制替换的数量,从左侧开始,但不会强制它位于开头。