2011-07-20 8 views
0

1つ以上の英数字コード(文字で始まる)がアンダースコアで区切られた文字列があります。いくつかのコードの後ろにアンダースコアで区切られたインデックス番号が続きます。英数字グループの後に数字を挿入していない数字グループを後で挿入します。

インデックスがあとにないコードの後に​​、インデックス番号(常に1)を挿入します。ここで

は、いくつかのサンプルです:

one     => one_1 
one_tw2_tre_for  => one_1_tw2_1_tre_1_for_1 
one_tw2_tre_23_for => one_1_tw2_1_tre_23_for_1 
one_3_tw2_4_tre_45 => one_3_tw2_4_tre_45 

私はにpreg_replaceを2回呼び出しでそれを行うことができます。

// Add '_1' after each code 
$s = preg_replace('/[A-Za-z][A-Za-z0-9]+/', '$0_1', $s); 
// Remove '_1' when followed by index 
$s = preg_replace('/_1_([0-9]+)/', '_$1', $s); 

二つが一つだけにpreg_replaceでそれを行う方法があります場合、私は(私が試し思ったんだけどルックアヘッドとルックバック、成功なし)、またはプロセッサの方が速い別の方法があります。

ありがとうございます! :-)

答えて

1
preg_replace('/[A-Za-z][A-Za-z0-9]+(?!_[0-9]|[A-Za-z0-9])/', '$0_1', $s); 

あるいは、より簡潔な:

preg_replace('/[A-Za-z][A-Za-z0-9]+(?=_|$)(?!_[0-9])/', '$0_1', $s); 
+0

ああヘクタール!先読みについての「ゼロ幅」メモを理解しました。私は同じ文字(この場合は '_')をチェックするようになる正の1つと負の1つを持つことができます。 乾杯! – Goozak

+0

あなたは私がお互いの後に倍数を組み合わせることができたことに気付く前に私は5年間それらを使っていたと思いますか?ああ、私が救った時... – Wrikken

関連する問題