- ベストアンサー
正規表現での置換えについて
- 正規表現を使った置換えについて悩んでいます。カンマで区切られた数字や英字の列を先頭だけ残して別の記号に変換する方法を知りたいです。
- 置換えの例として、222,1,33333を2??,1,3????に、55,22aaを5?,2???に置換えることを考えています。
- このような置換えは可能でしょうか。また、正規表現にはand条件はないようですが、and条件が使えない場合、別の関数で置換えを行う方法を教えていただきたいです。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
pregでよければこんな感じでも <?PHP $str="test\n222,1,33333\n55,22aa\ntest"; $pattern="/(^\w|(?<!,))\w/mis"; $replacement="\\1?"; print $str."<br>"; print preg_replace($pattern ,$replacement,$str); ?>
その他の回答 (2)
- sholmes
- ベストアンサー率81% (89/109)
PHPは見様見真似なのですが、ereg縛りの方が気になったので自分も混ぜて下さい。 http://ideone.com/LD0Oh eオプションを使っているので、\1と\2ぐらいしか使わないとは言え絶対安全なのかはわかりませんが・・・
お礼
回答ありがとうございます。 実は特にmb_ereg_replaceにこだわっていたわけではなく、マルチバイトにも対応できていたら後々便利かなぐらいに考えておりました。 とても参考になりました。
- ky072
- ベストアンサー率60% (85/140)
preg_replace() であれば色々と方法がありますね。 $dst = preg_replace( '/((^|,)[^,])([^,]+)/e', "'\\1'.str_repeat('?',strlen('\\3'))", $src ); mb_ereg_replace() に限定した場合、 ループさせて適用するのも面白いかもしれません。 $t = $src; do { $dst = $t; $t = mb_ereg_replace( '((^|,)[^,][?]*)[^,?]', '\\1?', $dst ); } while( strcmp( $t, $dst ) != 0 ); ※但し、データに元から「?」が含まれていると破綻します。
お礼
回答ありがとうございます。 e修飾子などとても参考になりました。
お礼
回答ありがとうございます。 戻り読み言明などわかっていなかったことが多くとても参考になりました。 ただ教えていただいた処理の根本的な置換えプロセスがまだ理解できず、応用を利かせることが出来ていません。 (これは他御二方の処理も同じなんですが) そのやり方は、カンマで区切られた数字や英字の列をその先頭と「2文字目」だけ残して別の記号(?など)に変換する、というものです。 変換例 222,1,33333 は 22?,1,33??? へ置換え 55,22aa は 55,22?? へ置換え 6 は 6 へ置換え(つまりそのまま) またこれもNo1さんに限らず助言いただきたいのですが、「言明は消費しない」などのメカニズムも含め、ごく基本的な置換えのプロセス(内部挙動)が理解できる、詳細にわかりやすく説明されたサイトや書籍をがありましたら教えていただけると助かります。 php.netの正規表現マニュアルや他のサイトも読んではいるのですが深い理解には至っていません。 (オライリーの5000円もする正規表現第3版とかですかねやっぱり…)