【问题标题】:php replace first occurrence of string from 0th position [duplicate]php从第0个位置替换第一次出现的字符串[重复]
【发布时间】:2012-03-24 19:33:19
【问题描述】:

我想在php中搜索并替换第一个单词,如下所示:

$str="nothing inside";

在不使用substr的情况下通过搜索和替换将“无”替换为“某物”

输出应该是:'里面的东西'

【问题讨论】:

  • 正则表达式在性能方面比使用其他方法要昂贵得多。 除非您认真考虑过其他编程方法来解决您的问题,否则永远不要默认使用正则表达式! 目前已经有 36K 的浏览量已经在全球范围内浪费了多少人的时间,因为他们的业余爱好者编程的性能不佳 没有对他们的相关问题有更好/正确的方法?

标签: php string replace substring


【解决方案1】:

使用preg_replace(),限制为1:

preg_replace('/nothing/', 'something', $str, 1);

用您要搜索的任何字符串替换正则表达式/nothing/。由于正则表达式总是从左到右计算,这将总是匹配第一个实例。

【讨论】:

  • 如果您只是使用通用字符串,例如 if $ 等在字符串中,则此解决方案存在转义问题。 stackoverflow.com/questions/1252693/… 有一个更通用的解决方案。
  • 正则表达式从不被视为任何编程语言的首选选项,因为它们的资源使用率较高周期。对于经验不足的人:如果您没有花费大量时间尝试确定解决问题的另一种方法,那么现在甚至还不是考虑正则表达式的合适时间。
【解决方案2】:

在 str_replace 的手册页 (http://php.net/manual/en/function.str-replace.php) 你可以找到这个函数

function str_replace_once($str_pattern, $str_replacement, $string){

    if (strpos($string, $str_pattern) !== false){
        $occurrence = strpos($string, $str_pattern);
        return substr_replace($string, $str_replacement, strpos($string, $str_pattern), strlen($str_pattern));
    }

    return $string;
}

使用示例:http://codepad.org/JqUspMPx

【讨论】:

  • 同preg_replace('/search/','replace',$str,1);
  • @Ben 功能类似,但绝对不一样。如果使用的字符需要通过正则表达式进行转义,使用 preg_replace 会出现意外错误。
【解决方案3】:

试试这个

preg_replace('/^[a-zA-Z]\s/', 'ReplacementWord ', $string)

它所做的是选择从开始到第一个空格的任何内容,并将其替换为 replcementWord 。注意替换词后有一个空格。这是因为我们在搜索字符串中添加了\s

【讨论】:

  • 我也是,不太擅长正则表达式。你可以试试这个链接 [So You Want to Learn Regular Expressions?] (stedee.id.au/Learn_Regular_Expressions)
  • 抱歉,我无法正确格式化它
  • 这个答案完全不正确——我不明白为什么它得到了 3 个赞。这显然是一个未经测试的帖子。
【解决方案4】:
preg_replace('/nothing/', 'something', $str, 1);

【讨论】:

  • 这将替换所有出现。 preg_replace('/OR/',' ',$str,1) 替换第一次出现的 'OR' 但不仅是前导
  • 纯代码答案在 Stackoverflow 上的价值很低。请解释您的答案是如何工作的以及为什么这是一个好主意。不熟悉preg_replace()的人可能不知道你为什么选择这个函数,也不知道参数是干什么的。请做一些事情/任何事情来提高这篇文章的教育价值。
【解决方案5】:

我遇到了这个问题并想要一个解决方案,但这对我来说不是 100% 正确,因为如果字符串像 $str = "mine'this ,撇号会导致问题。所以我想出了一个小技巧:

$stick='';
$cook = explode($str,$cookie,2);
        foreach($cook as $c){
            if(preg_match("/^'/", $c)||preg_match('/^"/', $c)){
                //we have 's dsf fds... so we need to find the first |sess| because it is the delimiter'
                $stick = '|sess|'.explode('|sess|',$c,2)[1];
            }else{
                $stick = $c;
            }
            $cookies.=$stick;
        }

【讨论】:

    【解决方案6】:

    这会检查并缓存一个命令中的第一个子字符串位置,如果存在,接下来替换它,应该更紧凑和高性能:

    if(($offset=strpos($string,$replaced))!==false){
       $string=substr_replace($replaced,$replacer,$offset,strlen($replaced));
    }
    

    【讨论】:

    • 是的,但这些是一个 if 和 2 个函数调用,嵌套,如果你能理解这个问题,它应该是自动解释的,否则你对答案不感兴趣。而且我使用了非常自动解释的名称变量,通常这应该足以解释何时知道代码的目的并且代码行很少
    【解决方案7】:

    This function str_replace 就是您要找的那个。

    【讨论】:

    • 第 4 个参数计算执行的替换,不将替换限制为一个数字
    • 你是对的。将编辑我的答案。
    • @steveoh: str_replace 替换所有出现,但如果它存在于开头,我只想要第一个出现,如 ltrim 函数仅删除第一个空格。
    • 显然你应该坚持mganjoo的答案,会接受它作为答案。
    【解决方案8】:

    ltrim() 将删除字符串开头不需要的文本。

    $do = 'nothing'; // what you want
    $dont = 'something'; // what you dont want
    $str = 'something inside';
    $newstr = $do.ltrim( $str , $dont);
    echo $newstr.'<br>';
    

    【讨论】:

    • ltrim() 删除给定列表中的所有字符,而不是字符序列。请更新您的答案。
    猜你喜欢
    • 2012-02-07
    • 1970-01-01
    • 1970-01-01
    • 2011-08-25
    • 2016-11-02
    • 1970-01-01
    相关资源
    最近更新 更多