web-dev-qa-db-ja.com

文字列の特定の部分を置き換えるにはどうすればよいですか?

文字列の特定の部分を別の部分に置き換えるにはどうすればよいですか?

入力文字列:

"Hello, my name is Santa"

文字列内のすべてのaを別の何かに変更するにはどうすればよいですか?

foreachループが必要だと思いますが、その使用方法がわかりません。

18
Stian
strtr ($str, array ('a' => '<replacement>'));

またはあなたの質問にもっと正確に答えるには:

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

検索と置換

文字列の特定の部分を他のものに置き換えるためのいくつかの異なる関数/メソッドがあり、すべて独自の利点があります。


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) →「通知:配列から文字列への変換」という通知が表示されます。これは、1つの検索文字列だけの置換配列は意味がないため、配列を変換する試行するためです。文字列。

  • 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
    _
  2. 大文字小文字を区別しません

    検索で大文字と小文字を区別したくない場合は、 str_ireplace() を使用できます(大文字のiに注意してください-insensitive)。

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


strtr() メソッド (50%バイナリセーフ、大文字と小文字を区別)

引数

文字列strtr(文字列$ str、文字列$ from、文字列$ to

文字列strtr(文字列$ str、配列$ replace_pairs

関数は、fromとtoの文字列で3つの引数をとるか、または置換配列array("search" => "replace" /* , ... */)で2つの引数をとります。これらはすべて、上記の定義で正しい順序で確認できます。

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()は何かを2回置換しません。例として:

    _echo strtr("aabb", ["a" => "b", "b" => "c"]);
    //Expected output: bbcc
    //Actual output:   bbcc
    _

    また、同じ文字列で複数のものを置き換えたい場合は、 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); 
} 

}
?>_


preg_replace() メソッド (バイナリセーフ、大文字と小文字を区別)

引数

混合preg_replace(混合$ pattern、混合$ replacement、混合$ 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():パラメーターが一致しません。パターンは文字列ですが、置換は配列です」という警告がスローされます。これは、1つの検索正規表現の置換配列では意味がないためです。

  • search(array) AND replace(array) →各検索正規表現のすべての一致を対応するreplace要素で置き換えます(キーは無視されます!)。

    • search(more elements) AND replace(less elements) →各検索正規表現のすべての一致を対応するreplace要素で置き換えます(欠落しているreplace要素の場合、空の文字列が使用されます)。

    • search(less elements) AND replace(more elements) →各検索正規表現のすべての一致を対応するreplace要素で置き換えます(不要なreplace要素は無視されます)。

件名

  • 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
    _
  2. 大文字小文字を区別しません

    検索引数は正規表現なので、単純に _flag i_ を渡して、大文字と小文字を区別せずに検索できます。

  3. 多次元配列

    preg_replace()は、多次元配列では機能しません。

  4. 後方参照

    正規表現のキャプチャグループへの後方参照として_\\n_/_$n_を使用できることに注意してください。ここで_0_は完全一致で、キャプチャグループは_1-99_です。

    また、後方参照の直後に数値が続く場合は、_\${n}_を使用する必要があります。

  5. 置換/ "/ e修飾子は廃止されました"

    preg_replace()の置換では、コールバック関数を置換として使用できません。したがって、 preg_replace_callback() を使用する必要があります。修飾子eを使用して「非推奨:preg_replace():/ e修飾子は非推奨です。代わりにpreg_replace_callbackを使用してください」と取得する場合も同様です。参照: preg_replace()e修飾子を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); 
} 
} 
?>_


ループ while / for / foreach メソッド (バイナリセーフではありません。大文字と小文字が区別されます)

もちろん、これらすべての関数に加えて、単純なループを使用して文字列をループし、それぞれの_search => replace_ペアを置き換えることもできます。

ただし、バイナリセーフで大文字と小文字を区別せず、多次元配列の場合は、上記の関数を使用するよりもさらに複雑になります。そのため、ここでは例を示しません。



影響を受ける文字列

現在、上記のすべてのメソッドは文字列全体を置き換えます。しかし、文字列の特定の部分だけを置き換える場合もあります。

このため、おそらく substr_replace() を使用したい/使用できます。または、別の一般的な方法は substr() を使用して、その特定の部分文字列のみに置換を適用し、後で文字列をまとめることです。もちろん、正規表現を変更したり、文字列全体に置換を適用しないようにするために何かをしたりすることもできます。

20
Rizier123

str_replaceは単純な置換ジョブ(1文字の置換など)には十分ですが、より柔軟なものが必要な場合は、一般に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()が必要になります。

1
NekaraNef

これはPHP文字列関数なしでも機能します。ここでは 'a'を '&'にアンパサンド文字を変更します:

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

関数preg_replace()を使用

$text ='this is the old Word';

echo $text;
echo '<br>';

$text = preg_replace('/\bold Word\b/', 'NEW Word', $text);

echo $text;
0
sandeep kumar