Câu trả lời:
Dạng đơn giản, không có regex:
$prefix = 'bla_';
$str = 'bla_string_bla_bla_bla';
if (substr($str, 0, strlen($prefix)) == $prefix) {
$str = substr($str, strlen($prefix));
}
Mất: 0,0369 ms (0,000,036,954 giây)
Và với:
$prefix = 'bla_';
$str = 'bla_string_bla_bla_bla';
$str = preg_replace('/^' . preg_quote($prefix, '/') . '/', '', $str);
Mất: 0,1749 ms (0,000,174,999 giây) lần chạy đầu tiên (biên dịch) và 0,0510 ms (0,000,051,021 giây) sau.
Hồ sơ trên máy chủ của tôi, rõ ràng.
if(condition) { statement }
sẽ rõ ràng hơn nhiều.
if (substr($str, 0, strlen($prefix)) == $prefix)
có thể được thay đổi if (0 === strpos($str, $prefix))
để tránh phân bổ bộ nhớ không cần thiết trong khi vẫn giữ nguyên khả năng đọc như nhau :)
Bạn có thể sử dụng các biểu thức thông thường với ký hiệu dấu mũ ( ^
) neo khớp với đầu chuỗi:
$str = preg_replace('/^bla_/', '', $str);
substr()
phiên bản ... Tôi đoán nó có, và nên được đánh dấu là câu trả lời thích hợp.
preg_quote
'd
multibyte
ác mộng là một vấn đề khác với các giải pháp khác trong khi điều này hoạt động tốt nếu mã hóa của tệp là chính xác. Dù sao, nó không nên nằm trong phạm vi của câu hỏi này nên tôi không quan tâm.
substr
và strpos
không thể chấp nhận một mảng. Ở đó bạn đi, tăng hiệu suất nhất định nếu bạn đang làm việc với một mảng. Chúc mừng!
function remove_prefix($text, $prefix) {
if(0 === strpos($text, $prefix))
$text = substr($text, strlen($prefix)).'';
return $text;
}
.''
không cần thiết.
(substr($str, 0, strlen($prefix)) == $prefix)
từ câu trả lời được chấp nhận giống như .37
Đây.
$array = explode("_", $string);
if($array[0] == "bla") array_shift($array);
$string = implode("_", $array);
_
. Có một phiên bản chung?
Tôi nghĩ lớp nền có thể làm những gì bạn muốn, nơi bạn có thể giới hạn sự thay thế của mình trong một phần của chuỗi: http://nl3.php.net/manual/en/feft.substr-replace.php (Điều này sẽ cho phép bạn chỉ nhìn vào đầu chuỗi.)
Bạn có thể sử dụng tham số đếm của str numplace ( http://nl3.php.net/manual/en/feft.str-replace.php ), điều này sẽ cho phép bạn giới hạn số lần thay thế, bắt đầu từ bên trái, nhưng nó sẽ không thực thi nó ngay từ đầu.
substr_replace
sẽ thay thế các ký tự trong phạm vi đã cho bất kể chúng là tiền tố bạn muốn xóa hay thứ gì khác. OP muốn xóa bla_
chỉ khi nó được tìm thấy ở đầu chuỗi.
Tốc độ đẹp, nhưng điều này được mã hóa cứng để phụ thuộc vào kim kết thúc bằng _. Có một phiên bản chung? - chập chững ngày 29 tháng 6 lúc 23:26
Một phiên bản chung:
$parts = explode($start, $full, 2);
if ($parts[0] === '') {
$end = $parts[1];
} else {
$fail = true;
}
Một số điểm chuẩn:
<?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);
Trên PC khá cũ của tôi:
$ php bench.php
Đầu ra:
strpos+strlen : 0.158388 s
explode : 0.126772 s
Đây là một cách tiếp cận thậm chí nhanh hơn:
// strpos is faster than an unnecessary substr() and is built just for that
if (strpos($str, $prefix) === 0) $str = substr($str, strlen($prefix));
Điều này sẽ loại bỏ trận đấu đầu tiên bất cứ nơi nào nó được tìm thấy, tức là bắt đầu hoặc giữa hoặc kết thúc.
$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);
?>
str_replace ( mixed $search , mixed $replace , mixed $subject [, int &$count ] )
bây giờ làm những gì bạn muốn
$str = "bla_string_bla_bla_bla";
str_replace("bla_","",$str,1);
str_replace()
nhân chức năng $count
tham số được kỳ vọng sẽ là một biến thông qua tham khảo để chứa các số thay thế được tìm thấy, không hạn chế số lượng thay thế.
Xóa www. từ đầu chuỗi, đây là cách dễ nhất (ltrim)
$a="www.google.com";
echo ltrim($a, "www.");
ltrim($a, "w.");
sẽ chỉ thực hiện công việc nếu tên miền không bắt đầu bằng "w". ltrim ('m.google.com', ".omg")
kết quả trong le.com
.
ltrim
, nó được sử dụng không chính xác. tham số thứ hai là một danh sách các ký tự nên được cắt bớt; do đó một cái "w."
sẽ là đủ.
s($str)->replacePrefix('_bla')
hữu ích, như được tìm thấy trong thư viện độc lập này .