- ベストアンサー
文字列の末尾を削除
$moji="あいうえ215おかき15"; ↓ $moji="あいうえ215おかき"; のように変更したいのですがわかりません。 $moji=mb_ereg_replace('[^0-9a-zA-Z_]', '', $moji); すると真ん中の数字も消えるので駄目! rtrimは特定の末尾文字だけですし正規表現できない。 宜しくお願い致します。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
訂正。 今回の場合パターン中にマルチバイト文字が含まれていないので、UTF-8であれば $moji = preg_replace('/\w++\z/u', '', $moji); としなくても $moji = preg_replace('/\w++\z/', '', $moji); で十分でした。u修飾子は不要でした。
その他の回答 (3)
- yambejp
- ベストアンサー率51% (3827/7415)
見た感じ「数字」を消したいようにみえますが、「英数字」を消したいのでしょうか? まし数字だけなら\dでマッチさせます 複数行あっても最終行だけ処理するなら $pattern="/\d+$/u"; 複数行の各行末を処理したいならm修飾子 $pattern="/\d+$/mu"; でよくないですか? <?PHP $moji="あいうえ215おかき15\naiueo111kakiku222"; $pattern="/\d+$/mu"; print preg_replace($pattern,"",$moji)."<br>"; $pattern="/\d+$/u"; print preg_replace($pattern,"",$moji)."<br>"; ?>
お礼
ありがとうございます。 解決です!助かりました。
UTF-8(推奨)ならば $moji = preg_replace('/\w++\z/u', '', $moji); Shift_JISであれば mb_regex_encoding('SJIS-WIN'); $moji = mb_ereg_replace('\w++\z', '', $moji); EUC-JPであれば mb_regex_encoding('EUC-JP'); $moji = mb_ereg_replace('\w++\z', '', $moji); ・ 「\w」は「[0-9a-zA-Z_]」と全く同じ意味です。 ・ 「$」は末尾または末尾手前の改行にマッチしますが、「\z」は末尾にしかマッチしません(今回はどちらでもよさそうですが) ・ 「+」よりも「++」とした方が動作が速くなります。(下で詳しく述べます) あいうえ123おかき45 この例において、 ● 「\w+」のとき 1. 「1」にマッチし、次の文字を調べる。 2. 「12」にマッチし、次の文字を調べる。 3. 「123」にマッチし、ここで「\w+」のマッチはいったん終了する。 4. 「123」のときこの場所は「\z」にはマッチしないので、バックトラックを行う。 5. 「12」のときこの場所は「\z」にはマッチしないので、バックトラックを行う。 6. 「1」のときこの場所は「\z」にはマッチしない。よってここはマッチ失敗とする。 7. 「4」にマッチし、次の文字を調べる。 8. 「45」にマッチし、ここで「\w+」のマッチはいったん終了する。 9. 「45」のときこの場所は「\z」にはマッチする。よってここはマッチ成功とする。 ● 「\w++」のとき 1. 「1」にマッチし、次の文字を調べる。 2. 「12」にマッチし、次の文字を調べる。 3. 「123」にマッチし、ここで「\w++」のマッチはいったん終了する。 4. 「123」のときこの場所は「\z」にはマッチしない。「++」を用いたのでバックトラックを行わず、即座にマッチ失敗とする。 5. 「4」にマッチし、次の文字を調べる。 6. 「45」にマッチし、ここで「\w++」のマッチはいったん終了する。 7. 「45」のときこの場所は「\z」にはマッチする。よってここはマッチ成功とする。 ちょっとした正規表現でもこうやって無駄を潰す配慮はしたほうがいいと思います。 ちなみに今回は実践していませんが、普段なら私は $moji = preg_replace('/\\w++\\z/u', '', $moji); $moji = mb_ereg_replace('\\w++\\z', '', $moji); $moji = mb_ereg_replace('\\w++\\z', '', $moji); というように全ての「\」をエスケープして書きます。 その理由について↓ http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10110102910
- hanabutako
- ベストアンサー率54% (492/895)
$moji=mb_ereg_replace('[0-9a-zA-Z_]+$', '', $moji);
お礼
詳しく教えていただきありがとうございます。 助かりました。