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

iibxawm4  于 2022-12-17  发布在  PHP
关注(0)|答案(9)|浏览(148)

我有一个字符串,看起来像这样:

$str = "bla_string_bla_bla_bla";

如何删除第一个bla_;但前提是它出现在字符串的开头
对于str_replace(),它删除 * 所有 * bla_的。

bmvo0sr5

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秒)。
很明显,是在我的服务器上。

ycl3bljg

ycl3bljg2#

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

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

9vw9lbht3#

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

lrl1mhuk4#

下面是一个更快的方法:

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

k5hmc34c5#

给你。

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

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
gopyfrb3

gopyfrb37#

这里有很多不同的答案。看起来都是基于字符串分析的。下面是我对这个问题的看法。我使用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
3df52oht

3df52oht8#

在PHP 8+中,我们可以使用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
编辑:修正了示例代码中的一个拼写错误(右括号)。

vddsk6oq

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参数,这将允许您限制替换的数量,从左侧开始,但不会强制它位于开头。

相关问题