【问题标题】:How do I replace certain parts of my string?如何替换字符串的某些部分?
【发布时间】:2011-12-31 02:45:12
【问题描述】:

如何将字符串的某一部分替换为另一部分?

输入字符串:

"Hello, my name is Santa"

如何将字符串中的所有a 更改为其他内容?

我想我需要一个foreach 循环,但我不确定如何使用它。

【问题讨论】:

  • 对..它也应该是第一个结果:)
  • 另外,ereg_ 系列的弃用并不意味着您不能在 PHP 中使用正则表达式。有PCRE (preg_) 家族。微小的差异不应该让你远离使用它。
  • @Madmartigan:并不是每个人都觉得手册很有吸引力。虽然这很可能是 stackoverflow 上十亿个问题的重复,但对于问答网站来说,这不是一个坏问题,对吧?
  • @zvran:当我可以(字面上)将问题标题复制/粘贴到谷歌并获得明确的结果时,我会说 OP 还没有耗尽他的资源。一方面,网站混乱(通过简单的研究很容易回答的重复问题)对网站是不利的,但另一方面,对于下一个确实做一点研究的人来说,这可能是好事(更多结果)。虽然 PHP 手册可能并不“吸引人”,但它肯定是权威,并且您应该首先检查此类简单问题。我看到我的评论被删除了,但它包含一个有价值的链接。

标签: php string replace


【解决方案1】:
strtr ($str, array ('a' => '<replacement>'));

或者更准确地回答您的问题:

strtr ("Hello, my name is Santa", array ('a' => '<replacement>'));

【讨论】:

  • 这会替换字符串中的所有“a”字符吗?
  • 我需要将 $str 更改为我想要更改的字符串的变量,对吧?
  • 是的,$str 是要处理的字符串,我已经更改了答案以反映这一点。
【解决方案2】:

搜索和替换

有几种不同的函数/方法可以用其他东西替换字符串的某个部分,它们都有自己的优势。


##str_replace() 方法(二进制安全;区分大小写)

参数

混合str_replace(混合$search,混合$replace,混合$subject [, int &$count])

str_replace() 有 3 个必需的参数,正如您在上面的定义中看到的,它们的顺序正确,所有这些参数都可以将字符串作为数组作为参数!

搜索和替换

  • search(string) AND replace(string) → 用替换字符串替换搜索字符串。

  • search(array) AND replace(string) → 用替换字符串替换所有搜索元素。

  • search(string) AND replace(array) → 提示您:“Notice: Array to string conversion”,因为替换数组仅用于一个搜索字符串没有意义,所以它尝试将数组转换为字符串。

  • search(array) AND replace(array) → 用相应的替换元素替换每个搜索元素(忽略键!)。

  • search(more elements) AND replace(less elements) → 用相应的替换元素替换每个搜索元素(对于缺少的替换元素,将使用空字符串)。

  • search(less elements) AND replace(more elements) → 用对应的替换元素替换每个搜索元素(不需要的替换元素被忽略)。

主题

  • subject(string) → 对主题字符串进行替换。

  • subject(array) → 对每个数组元素进行替换。

代码

echo str_replace("search", "replace", "text search text");
echo str_replace(["t", "a"], "X", "text search text");
echo str_replace("search", ["replace1", "replace2"], "text search text");
echo str_replace(["a", "c"], ["X", "Y"], "text search text");

输出

text replace text
XexX seXrch XexX
Notice: Array to string conversion
text seXrYh text

备注

  1. 明白了!

重要的是要知道str_replace() 从数组的左到右工作。这意味着它可以替换您已经替换的值。例如:

    echo str_replace(array("a", "b"), array("b", "c"), "aabb");
    //Probably expected output: bbcc
    //Actual output:            cccc
  1. 不区分大小写

如果您想让搜索不区分大小写,可以使用str_ireplace()(注意i 区分大小写-insensitive)。

  1. 多维数组

str_replace()/str_ireplace() 不适用于多维数组。有关此类实现,请参阅此 manual comment。当然你也可以把str_replace()换成str_ireplace()来区分大小写。

如果您想将所有内容放在一起并创建一个也适用于不区分大小写的多维数组的函数,您可以执行以下操作:

<?php 
function str_ireplace_deep($search, $replace, $subject) 
{ 
if (is_array($subject)) 
{ 
    foreach($subject as &$oneSubject) 
        $oneSubject = str_ireplace_deep($search, $replace, $oneSubject); 
    unset($oneSubject); 
    return $subject; 
} else { 
    return str_ireplace($search, $replace, $subject); 
} 
} 
?>

##strtr() 方法(50% 二进制安全;区分大小写)

参数

字符串strtr(字符串$str,字符串$from,字符串$to

字符串strtr(字符串$str,数组$replace_pairs

该函数要么接受 3 个带有 from 和 to 字符串的参数,要么接受 2 个带有替换数组 array("search" =&gt; "replace" /* , ... */) 的参数,所有这些都可以在上面的定义中以正确的顺序看到。

2 个参数

它开始用对应的值替换最长的键,直到它替换了所有的key =&gt; value 对。在这种情况下,该函数是二进制安全的,因为它使用整个键/值。

3 个参数

它将主题中的 from 参数替换为 to 参数逐字节。所以它不是二进制安全的!

如果 from 和 to 参数的长度不等,则替换将在到达较短字符串的末尾时停止。

主题

它不接受一个数组作为主题,只接受一个字符串。

代码

echo strtr("text search text", "ax", "XY");;
echo strtr("text search text", ["search" => "replace"]);

输出

teYt seXrch teYt
text replace text

备注

  1. 明白了!

相对于str_replace()strtr() 不会替换被替换的字符串。举个例子:

    echo strtr("aabb", ["a" => "b", "b" => "c"]);
    //If expecting to replace replacements: cccc
    //Actual output:                        bbcc

另外,如果你想用相同的字符串替换多个东西,你可以使用array_fill_keys() 用值填充你的替换数组。

  1. 不区分大小写

strtr() 不区分大小写也不存在不区分大小写的等效函数。请参阅manual comment 了解不区分大小写的实现。

  1. 多维数组

strtr() 反对 str_replace() 不使用数组作为主题,因此它也不适用于多维数组。您当然可以将上面来自 str_replace() 的代码用于多维数组,并将其与 strtr()stritr() 的实现一起使用。

如果您想将所有内容放在一起并创建一个也适用于不区分大小写的多维数组的函数,您可以执行以下操作:

<?php
if(!function_exists("stritr")){
function stritr($string, $one = NULL, $two = NULL){
/*
stritr - case insensitive version of strtr
Author: Alexander Peev
Posted in PHP.NET
*/
    if(  is_string( $one )  ){
        $two = strval( $two );
        $one = substr(  $one, 0, min( strlen($one), strlen($two) )  );
        $two = substr(  $two, 0, min( strlen($one), strlen($two) )  );
        $product = strtr(  $string, ( strtoupper($one) . strtolower($one) ), ( $two . $two )  );
        return $product;
    }
    else if(  is_array( $one )  ){
        $pos1 = 0;
        $product = $string;
        while(  count( $one ) > 0  ){
            $positions = array();
            foreach(  $one as $from => $to  ){
                if(   (  $pos2 = stripos( $product, $from, $pos1 )  ) === FALSE   ){
                    unset(  $one[ $from ]  );
                }
                else{
                    $positions[ $from ] = $pos2;
                }
            }
            if(  count( $one ) <= 0  )break;
            $winner = min( $positions );
            $key = array_search(  $winner, $positions  );
            $product = (   substr(  $product, 0, $winner  ) . $one[$key] . substr(  $product, ( $winner + strlen($key) )  )   );
            $pos1 = (  $winner + strlen( $one[$key] )  );
        }
        return $product;
    }
    else{
        return $string;
    }
}/* endfunction stritr */
}/* endfunction exists stritr */

function stritr_deep($string, $one = NULL, $two = NULL){
if (is_array($string)) 
{ 
    foreach($string as &$oneSubject) 
        $oneSubject = stritr($string, $one, $two); 
    unset($oneSubject); 
    return $string; 
} else { 
    return stritr($string, $one, $two); 
} 

}
?>

##preg_replace() 方法(二进制安全;区分大小写)

参数

混合 preg_replace ( 混合 $pattern ,混合 $replacement ,混合 $subject [, int $limit = -1 [, int & $count ]])

preg_replace() 有 3 个必需参数,按上述顺序排列。现在它们三个都可以将字符串作为数组作为参数!

搜索和替换

  • search(string) AND replace(string) → 用替换字符串替换搜索正则表达式的所有匹配项。

  • search(array) AND replace(string) → 用替换字符串替换每个搜索正则表达式的所有匹配项。

  • search(string) AND replace(array) → 给你一个警告:“Warning: preg_replace(): Parameter mismatch, pattern is a string while replacement is an数组”,因为仅一个搜索正则表达式的替换数组没有意义。

  • search(array) AND replace(array) → 用相应的替换元素替换每个搜索正则表达式的所有匹配项(忽略键!)。

  • search(more elements) AND replace(less elements) → 用相应的替换元素替换每个搜索正则表达式的所有匹配项(对于缺少的替换元素,一个空字符串将被使用)。

  • 搜索(更少元素)和替换(更多元素) → 将每个搜索正则表达式的所有匹配项替换为相应的替换元素(忽略不需要的替换元素)。

主题

  • subject(string) → 对主题字符串进行替换。

  • subject(array) → 对每个数组元素进行替换。

再次请注意:搜索必须是正则表达式!这意味着它需要分隔符并且需要转义特殊字符。

代码

echo preg_replace("/search/", "replace", "text search text");
echo preg_replace(["/t/", "/a/"], "X", "text search text");
echo preg_replace("/search/", ["replace1", "replace2"], "text search text");
echo preg_replace(["a", "c"], ["X", "Y"], "text search text");

输出

text replace text
XexX seXrch XexX
Warning: preg_replace(): Parameter mismatch, pattern is a string while replacement is an array
text seXrYh text

备注

  1. 明白了!

str_replace() 相同,preg_replace() 从数组的左到右工作。这意味着它可以替换您已经替换的值。例如:

    echo preg_replace(["/a/", "/b/"], ["b", "c"], "aabb");
    //Probably expected output: bbcc
    //Actual output:            cccc
  1. 不区分大小写

由于搜索参数是一个正则表达式,您可以简单地传递flag i 进行不区分大小写的搜索。

  1. 多维数组

preg_replace() 不适用于多维数组。

  1. 反向引用

请注意,您可以使用\\n/$n 作为正则表达式捕获组的反向引用。其中0 是整个比赛,1-99 是您的捕获组。

此外,如果反向引用后面紧跟一个数字,则必须使用 \${n}

  1. 替换/“/e 修饰符已弃用”

preg_replace() 中的替换不能使用回调函数作为替换。所以你必须使用preg_replace_callback()。当您使用修饰符 e 并获得“已弃用:preg_replace():/e 修饰符已弃用,请改用 preg_replace_callback”时相同。见:Replace preg_replace() e modifier with preg_replace_callback

如果您想将所有内容放在一起并创建一个也适用于不区分大小写的多维数组的函数,您可以执行以下操作:

<?php
function preg_replace_deep($search, $replace, $subject) 
{ 
if (is_array($subject)) 
{ 
    foreach($subject as &$oneSubject) 
        $oneSubject = preg_replace_deep($search, $replace, $oneSubject); 
    unset($oneSubject); 
    return $subject; 
} else { 
    return preg_replace($search, $replace, $subject); 
} 
} 
?>

##Loops while / for / foreach 方法(非二进制安全;区分大小写)

当然,除了所有这些函数之外,您还可以使用一个简单的循环来遍历字符串并替换您拥有的每个 search =&gt; replace 对。

但是,当您使用二进制安全、不区分大小写和多维数组时,这比仅使用上述函数要复杂得多。所以这里就不举例子了。



受影响的字符串

现在上面显示的所有方法都对整个字符串进行替换。但有时您只想为字符串的某个部分替换某些内容。

为此,您可能想要/可以使用substr_replace()。或者另一种常见的方法是使用substr() 并仅在该特定子字符串上应用替换,然后将字符串放在一起。当然,您也可以修改您的正则表达式或做其他事情以不将替换应用于整个字符串。

【讨论】:

    【解决方案3】:

    str_replace 对于简单的替换工作(例如替换单个字母)就足够了,但通常建议使用 preg_replace(如果你想要更灵活或更通用的东西 ),因为它灵活且用途广泛。因为'a'只是一个例子......:

    $String = preg_replace('/<string>/','<replacement>',$String);
    

    或者,如果您想一次更换多个:

    $String = preg_replace(array('/<string 1>/','/<string 2>/'),array('<replacement 1>','<replacement 2>'),$String);
    

    不幸的是,preg_replace 使用起来非常棘手。我推荐以下阅读: http://php.net/manual/en/function.preg-replace.php http://www.phpro.org/tutorials/Introduction-to-PHP-Regex.html

    另外,如果您决定使用 str_replace(),并且您的替换需要区分大小写,那么您将需要 str_ireplace()。

    【讨论】:

    • 不要不要将正则表达式用于替换单个字母等简单任务。
    • “str_replace 足以满足简单的替换工作”和“因为 'a' 只是一个例子......”的哪一部分不可读或难以理解?
    • 因为你错了。 preg_replace() 通常是建议的。它总是取决于用例。您的两个示例都可以使用 str_replace() 轻松完成,而不是使用正则表达式。
    • 是的,这两个示例都可以使用 str_replace() 轻松完成。问题是,它们是示例。通过立即显示正则表达式来编写一个难以理解的示例有什么意义?那只会让人反感。但我会换个说法来逗你一笑:通常建议使用 preg_replace ,除非你正在寻找大多数程序员实际上很少需要的真正简单易用的替代品。
    • 当有疑问的问题可以用 str_replace() 解决时,显示 preg_replace() 有什么意义? “大多数程序员实际上很少需要”?此声明有任何参考资料吗?
    【解决方案4】:

    这也可以在没有任何 PHP 字符串函数的情况下工作,这里将你的 'a' 更改为 '&' 和号字符:

    for ($i=0; $i<strlen($str); $i++){
        if ($str[$i] == 'a'){
            $str[$i] = '&';
        }
    }
    echo $str;
    

    【讨论】:

    • 当您像访问超过 1 个字符的数组一样访问字符串时,您无法替换字符串中的某些内容。
    【解决方案5】:

    使用函数 preg_replace()

    $text ='this is the old word';
    
    echo $text;
    echo '<br>';
    
    $text = preg_replace('/\bold word\b/', 'NEW WORD', $text);
    
    echo $text;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-08
      • 2013-12-20
      • 1970-01-01
      • 2023-03-04
      • 2018-07-14
      • 2017-08-30
      • 2017-08-30
      • 2014-03-27
      相关资源
      最近更新 更多