如何更换字符串的某些部分?搜索和替换受影响的字符串

2022-08-30 18:13:31

如何用另一部分替换字符串的某个部分?

输入字符串:

"Hello, my name is Santa"

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

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


答案 1
strtr ($str, array ('a' => '<replacement>'));

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

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

答案 2

搜索和替换

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


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

参数

混合str_replace(混合$search , 混合$replace混合$subject [, 国际和$count] )

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

搜索和替换

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

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

  • search(string) AND replace(array)→会给你一个通知:“注意:数组到字符串的转换”,因为只有一个搜索字符串的替换数组没有意义,所以它尝试将数组转换为字符串。

  • 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()(请注意 for-i不敏感)。i

  1. 多维数组

str_replace()/str_ireplace()不适用于多维数组。有关此类实现,请参阅此手动注释。当然,您也可以替换为不区分大小写。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" => "replace" /* , ... */)

2 参数

它开始用相应的值替换最长的键,并执行此操作,直到它替换所有对。在这种情况下,该函数是二进制安全的,因为它使用整个键/值。key => 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()不区分大小写 NOR 是否存在不区分大小写的等效函数。有关不区分大小写的实现,请参阅此手册注释

  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[,国际$limit= -1 [,国际$count]])

preg_replace()按上面显示的顺序有 3 个必需的参数。现在,它们中的3个都可以将字符串作为数组作为参数!

搜索和替换

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

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

  • search(string) AND replace(array)→会给你一个警告:“警告:preg_replace():参数不匹配,模式是一个字符串,而替换是一个数组”,因为只有一个搜索正则表达式的替换数组没有意义。

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

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

  • search(less elements) AND replace(more 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. 不区分大小写

由于搜索参数是正则表达式,因此只需传递标志 i 即可进行不区分大小写的搜索。

  1. 多维数组

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

  1. 反向引用

请注意,您可以使用 / 作为对正则表达式的捕获组的反向引用。整个匹配项的位置以及捕获组的位置。\\n$n01-99

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

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

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

如果你想把所有东西放在一起,并创建一个也适用于不区分大小写的多维数组的函数,你可以做这样的事情:

<?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 => replace

但是,当您执行二进制安全,不区分大小写和多维数组时,这比仅使用上述函数时会变得更加复杂。所以我不会在这里包括任何例子。



受影响的字符串

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

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


推荐