Answers:
普通格式,不带正则表达式:
$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秒)之后。
显然,已在我的服务器上进行了分析。
if(condition) { statement }
将变得如此清晰。
if (substr($str, 0, strlen($prefix)) == $prefix)
可以更改为if (0 === strpos($str, $prefix))
避免不必要的内存分配,同时保持相同的可读性:)
您可以使用带有脱字符号(^
)的正则表达式,将匹配项锚定到字符串的开头:
$str = preg_replace('/^bla_/', '', $str);
substr()
版本快...我想是的,应该将其标记为正确答案。
preg_quote
'd
multibyte
噩梦是其他解决方案的另一个问题,但是如果文件的编码正确,这将很有效。无论如何,它不应该在这个问题的范围内,所以我不在乎。
substr
并且strpos
不能接受数组。如果您要处理数组,就可以得到明显的性能提升。干杯!
function remove_prefix($text, $prefix) {
if(0 === strpos($text, $prefix))
$text = substr($text, strlen($prefix)).'';
return $text;
}
.''
是没有必要的。
(substr($str, 0, strlen($prefix)) == $prefix)
从被接受的答案
这里。
$array = explode("_", $string);
if($array[0] == "bla") array_shift($array);
$string = implode("_", $array);
_
。有通用版本吗?
我认为substr_replace可以满足您的需求,您可以在其中将替换限制为字符串的一部分:http : //nl3.php.net/manual/en/function.substr-replace.php(这将使您仅查看字符串的开头。)
您可以使用str_replace的count参数(http://nl3.php.net/manual/en/function.str-replace.php),这将允许您限制从左侧开始的替换次数,但是不会强制将其开始。
substr_replace
会替换给定范围内的字符,无论它们是您要删除的前缀还是其他名称。OP希望删除bla_
“仅在字符串的开头找到它”。
速度不错,但是很难将其编码为取决于以_结尾的指针。有通用版本吗?– toddmo 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);
在我的旧家用PC上:
$ 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));
这将删除找到的第一个匹配项,即开始或中间或结尾。
$str = substr($str, 0, strpos($str, $prefix)).substr($str, strpos($str, $prefix)+strlen($prefix));
<?php
$str = 'bla_string_bla_bla_bla';
echo preg_replace('/bla_/', '', $str, 1);
?>
删除www。从字符串开始,这是最简单的方法(ltrim)
$a="www.google.com";
echo ltrim($a, "www.");
ltrim($a, "w.");
仅当域不以“ w”开头时,才可以执行此操作。ltrim ('m.google.com', ".omg")
结果le.com
。
ltrim
,也不会正确使用它。第二个参数是应修剪的字符列表;因此,一个"w."
就足够了。
s($str)->replacePrefix('_bla')
如在该独立库中所发现的,您可能会有所帮助。