如何更换我的字符串的某些部分?

Sti*_*ian 17 php string replace

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

输入字符串:

"Hello, my name is Santa"
Run Code Online (Sandbox Code Playgroud)

如何a用其他东西改变我的字符串中的所有内容?

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

zrv*_*van 23

strtr ($str, array ('a' => '<replacement>'));
Run Code Online (Sandbox Code Playgroud)

更新:

strtr ("Hello, my name is Santa", array ('a' => '<replacement>'));
Run Code Online (Sandbox Code Playgroud)

更准确地回答你的问题.


Riz*_*123 20

搜索和替换

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


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)→向您发出通知:"注意:数组到字符串转换",因为只有一个搜索字符串的替换数组没有意义,因此它尝试将数组转换为字符串.

  • 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");
Run Code Online (Sandbox Code Playgroud)

产量

text replace text
XexX seXrch XexX
Notice: Array to string conversion
text seXrYh text
Run Code Online (Sandbox Code Playgroud)

笔记

  1. 疑难杂症!

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

    echo str_replace(array("a", "b"), array("b", "c"), "aabb");
    //Probably expected output: bbcc
    //Actual output:            cccc
    
    Run Code Online (Sandbox Code Playgroud)
  2. 不区分大小写

    如果你想搜索不区分大小写,您可以使用str_ireplace()(注意i对个案 nsensitive).

  3. 多维数组

    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); 
} 
} 
?>
Run Code Online (Sandbox Code Playgroud)


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

参数

string strtr(string $ str,string $ from,string $ to)

string strtr(string $ str,array $ replace_pairs)

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

2个论点

它开始用相应的值替换最长的密钥并执行此操作直到它替换所有key => value对.在这种情况下,该函数是二进制安全的,因为它使用整个键/值.

3个论点

它用byte替换from参数和主题中的to参数.所以它不是二进制安全的!

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

学科

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

echo strtr("text search text", "ax", "XY");;
echo strtr("text search text", ["search" => "replace"]);
Run Code Online (Sandbox Code Playgroud)

产量

teYt seXrch teYt
text replace text
Run Code Online (Sandbox Code Playgroud)

笔记

  1. 疑难杂症!

    反对str_replace(),strtr()不会取代两次.举个例子:

    echo strtr("aabb", ["a" => "b", "b" => "c"]);
    //Expected output: bbcc
    //Actual output:   bbcc
    
    Run Code Online (Sandbox Code Playgroud)

    此外,如果您想使用相同的字符串替换多个内容,可以使用array_fill_keys()该值来填充替换数组.

  2. 不区分大小写

    strtr()不区分大小写NOR是否存在不区分大小写的等效函数.有关不区分大小写的实现,请参阅本手册注释.

  3. 多维数组

    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); 
} 

}
?>
Run Code Online (Sandbox Code Playgroud)


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

参数

混合preg_replace(混合$ pattern,混合$替换,混合$ subject [,int $ limit = -1 [,int&$ 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");
Run Code Online (Sandbox Code Playgroud)

产量

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

笔记

  1. 疑难杂症!

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

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

    由于search参数是一个正则表达式,因此您只需传递flag ifor case-insensitive搜索.

  3. 多维数组

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

  4. 反向引用

    请注意,您可以使用\\n/ $n作为正则表达式的捕获组的反向引用.0整场比赛在哪里以及1-99您的捕获组.

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

  5. 替换/"/ e修饰符已弃用"

    替换中preg_replace()不能使用回调函数作为替换.所以你必须使用preg_replace_callback().使用修饰符e并获得"Deprecated:preg_replace()时相同:不推荐使用/ e修饰符,而是使用preg_replace_callback".请参阅:使用preg_replace_callback替换preg_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); 
} 
} 
?>
Run Code Online (Sandbox Code Playgroud)


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

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

但是,当你使用二进制安全,不区分大小写和多维数组时,这比使用上面的函数更复杂.所以我不会在这里包含任何例子.



受影响的字符串

现在,上面显示的所有方法都在整个字符串上进行替换.但有时你只想替换字符串的某个部分.

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