2011-01-15 7 views
1

私は、針の後に文字列で置き換えますか?

bbbbabbbbbccccc

のようなものを文字列を持っているが、私はせずに「」「C」に一つだけの文字の後にすべての文字「b」を交換するためにどのような方法がありますPHPを使用して、文字列を分割するには?

bbbbacccccccccc

+2

なぜ文字列を分割しませんか? – Amber

答えて

1

奇妙な質問。

echo preg_replace('/a(.*)$/e', "'a'.strtr($1, 'b', 'c')", 'bbbabbbbbccccc'); 

preg_replaceは正規表現で 'a'のすべての部分を一致させます。 regex内のe修飾子は、置換文字列をコードとして評価します。置換文字列のコードはstrtr()を使って 'b'を 'c'に置き換えます。

1

ここには3つのオプションがあります。

まず、分割。はい、私は分割なしでそれをしたいと思っています。

$string = 'bbbbabbbbbccccc'; 
$parts = preg_split('/(a)/', $string, 2, PREG_SPLIT_DELIM_CAPTURE); 
// Parts now looks like: 
// array('bbb', 'a', 'bbbbcccc'); 
$parts[2] = str_replace('b', 'c', $parts[2]); 
$correct_string = join('', $parts); 

次に、位置検索と部分文字列の置換。

$string = 'bbbbabbbbbccccc'; 
$first_a_index = strpos($string, 'a'); 
if($first_a_index !== false) { 
// Now, grab everything from that first 'a' to the end of the string. 
    $replaceable = substr($string, $first_a_index); 
// Replace it. 
    $replaced = str_replace('b', 'c', $replaceable); 
// Now splice it back in 
    $string = substr_replace($string, $replaced, $first_a_index); 
} 

第3に、正規表現を投稿するつもりでしたが、the one dqhendricks postedも同様です。

これらのコード例は、わかりやすくするために冗長であり、1つまたは2つのライナーに減らすことができます。

1
$s = 'bbbbabbbbbccccc'; 
echo preg_replace('/((?:(?!\A)\G|(?<!a)a(?!a))[^b]*)b/', '$1c', $s); 

\Gは、前回の試合が終了した位置と一致します。最初の試合では、\G\Aのような文字列の先頭に一致します。私たちはそれを望まないので、それを防ぐために(?!\A)を使用します。

(?<!a)a(?!a)は、aの前にも後にもないaに一致します。 aはグループ#1にキャプチャされているため、交換先に$1で接続できます。

これは、「」への1回の呼び出しでジョブ全体を実行し、埋め込みコードと/e修飾子に依存しない「純粋な正規表現」ソリューションです。あなたがこれらの制約の中で働いていることが分かった場合には知っておくと良いですが、それは間違いなく最初の手段ではありません。

関連する問題