文字列の一部を削除する方法は?[閉まっている]


152

文字列の一部を削除するにはどうすればよいですか?

文字列の例: "REGISTER 11223344 here"

"11223344"上記の文字列の例からどのように削除できますか?


あなたの質問は不明確/あいまいです。用語を使用してremoveいますextractが、対象の文字列をデータベースに格納できるようにするために使用している可能性があります。
mickmackusa

@真琴私はあなたが質問を破壊して多くの答えを正解させたことにかなり自信を持っています。考えてみてください。なぜOP REGISTER hereはデータベースに保存するのでしょうか。
mickmackusa

2
@mickmackusa removeはtake fromと同義である可能性があります。つまり、文字列から11223344を取り出すと、ここで問題が発生しません。最悪の場合、それは、それは確かに「荒らさ」いない曖昧だ
ニック・

破壊前のバージョンを読む。@Nick stackoverflow.com/posts/2192170/revisions真実はあなたの心を変えるでしょう。この質問は「不明」として締め切らせていただきます。
mickmackusa

2
@mickmackusa私がやった...私はあなたのポイントを見ることができません。書かれている
Nick

回答:



119

次のように定義されているstr_replace()を使用できます。

str_replace($search, $replace, $subject)

したがって、コードは次のように書くことができます。

$subject = 'REGISTER 11223344 here' ;
$search = '11223344' ;
$trimmed = str_replace($search, '', $subject) ;
echo $trimmed ;

正規表現によるより良いマッチングが必要な場合は、preg_replace()を使用できます。


2
regexマッチングが必要な場合は、preg_replace()us2.php.net/manual/en/function.preg-replace.php
Elijah Lynn

4
この回答が投稿された理由がわからない、それはドミニクの回答の長い複製とローランドの回答の短い複製です...
CPHPython

23

11223344が一定でないと仮定

$string="REGISTER 11223344 here";
$s = explode(" ",$string);
unset($s[1]);
$s = implode(" ",$s);
print "$s\n";

9
str_replace(find, replace, string, count)
  • 見つけ必須。検索する値を指定します
  • 置き換え 必須。検索で値を置き換える値を指定します
  • 文字列 必須。検索する文字列を指定します
  • count オプション。置換数をカウントする変数

OPの例に従って:

$Example_string = "REGISTER 11223344 here";
$Example_string_PART_REMOVED = str_replace('11223344', '', $Example_string);

// will leave you with "REGISTER  here"

// finally - clean up potential double spaces, beginning spaces or end spaces that may have resulted from removing the unwanted string
$Example_string_COMPLETED = trim(str_replace('  ', ' ', $Example_string_PART_REMOVED));
// trim() will remove any potential leading and trailing spaces - the additional 'str_replace()' will remove any potential double spaces

// will leave you with "REGISTER here"

1
OPがこの疑似コードを使用することをどのように提案しますか?
mickmackusa

6

ルールベースのマッチングが必要な場合は、正規表現を使用する必要があります

$string = "REGISTER 11223344 here";
preg_match("/(\d+)/", $string, $match);
$number = $match[1];

それは最初の数のセットと一致するので、より具体的に試す必要がある場合:

$string = "REGISTER 11223344 here";
preg_match("/REGISTER (\d+) here/", $string, $match);
$number = $match[1];

preg_replace()の方がずっと簡単でしょう?us2.php.net/manual/en/function.preg-replace.php
Elijah Lynn

1
@ElijahLynn replaceは、物事を削除する必要があり、将来の変更やノイズが壊れます。_replaceを使用してこれを実行しても、_matchは引き続き機能します。
TravisO 2013

@TravisOまあはい、しかしいいえ。これら2つは、実装に関してはほとんど同じ機能であり、将来の変更がいずれかに影響を与える可能性は同じです。_matchのみが将来変更される可能性もあり、これを無効にしても_replaceは引き続き正常に機能します。また、バージョニングは通常、可能であれば以前の機能に影響を与えないよう非常に注意深く行われます。
CT。

ここではキャプチャグループは必要ありません。実際、キャプチャグループを使用すると、$matchアレイが不必要に膨張します。かっこを削除してからでアクセスし$match[0]ます。
mickmackusa

5

substr()は、文字列の一部を返す組み込みのphp関数です。関数substr()は文字列を入力として受け取ります。これは、文字列をトリミングするインデックス形式です。オプションのパラメーターは、部分文字列の長さです。あなたはhttp://php.net/manual/en/function.substr.phpで適切なドキュメントとサンプルコードを見ることができます

注:文字列のインデックスは0から始まります。


OPが一般的なヒントを使用して望ましい結果を達成することをどのように提案しますか?
mickmackusa

この答えは曖昧で価値の低いものだと思います。
mickmackusa

1

動的に、(a)文字列の(a)固定インデックスから(a)部分を削除する場合は、次の関数を使用します。

/**
 * Removes index/indexes from a string, using a delimiter.
 * 
 * @param string $string
 * @param int|int[] $index An index, or a list of indexes to be removed from string.
 * @param string $delimiter 
 * @return string
 * @todo Note: For PHP versions lower than 7.0, remove scalar type hints (i.e. the
 * types before each argument) and the return type.
 */
function removeFromString(string $string, $index, string $delimiter = " "): string
{
    $stringParts = explode($delimiter, $string);

    // Remove indexes from string parts
    if (is_array($index)) {
        foreach ($index as $i) {
            unset($stringParts[(int)($i)]);
        }
    } else {
        unset($stringParts[(int)($index)]);
    }

    // Join all parts together and return it
    return implode($delimiter, $stringParts);
}

あなたの目的のために:

remove_from_str("REGISTER 11223344 here", 1); // Output: REGISTER here

その使い方の1つは、コマンドのような文字列を実行することです。これは、その構造を知っています。


1
Ghostdogはすでに爆破-爆破テクニックを提案しましたが、このような基本的な操作でこのような長々としたテクニックを楽しませることは想像できません。
mickmackusa

0

次のスニペットは「ここに登録」を出力します

$string = "REGISTER 11223344 here";

$result = preg_replace(
   array('/(\d+)/'),
   array(''),
   $string
);

print_r($result);

preg_replace()APIを使用すると、以下のようになります。

$result = preg_replace(
    array('/pattern1/', '/pattern2/'),
    array('replace1', 'replace2'),
    $input_string
);

preg_replace()この場合、配列を渡す理由はまったくありません。キャプチャグループを使用するメリットもありません。
mickmackusa

同意する。便宜上、配列が追加されています。それは無視できます。害はありません。数字を除外するためのキャプチャグループを追加しました。これは、プロットされた質問どおりに機能しています。さらに、個人に基づいて、さらに変更や微調整を行うことができます。
arango_86

私の要点は、スニペットに不必要なインクルードがあり、インクルードしても意味がないということです。
mickmackusa

-1

以下をせよ

$string = 'REGISTER 11223344 here';

$content = preg_replace('/REGISTER(.*)here/','',$string);

これは「REGISTERhere」を返します

または

$string = 'REGISTER 11223344 here';

$content = preg_replace('/REGISTER (.*) here/','',$string);

これは「ここに登録」を返します


4
2つの空白を含む "REGISTER__here"を返しませんか(アンダースコアをスペースと見なしてください。コメントでは、2つのスペースを使用できません)。「(。*)」の前後にスペースがあるため。
TechNyquist 2014年

6
この答えは少なくとも100%間違っています。証明:3v4l.org/LDLEM なぜこの回答には15のUVがあるのですか?
mickmackusa
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.