重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

$moji="あいうえ215おかき15";

$moji="あいうえ215おかき";

のように変更したいのですがわかりません。

$moji=mb_ereg_replace('[^0-9a-zA-Z_]', '', $moji);
すると真ん中の数字も消えるので駄目!

rtrimは特定の末尾文字だけですし正規表現できない。

宜しくお願い致します。

A 回答 (4件)

訂正。


今回の場合パターン中にマルチバイト文字が含まれていないので、UTF-8であれば

$moji = preg_replace('/\w++\z/u', '', $moji);

としなくても

$moji = preg_replace('/\w++\z/', '', $moji);

で十分でした。u修飾子は不要でした。
    • good
    • 0
この回答へのお礼

詳しく教えていただきありがとうございます。
助かりました。

お礼日時:2013/07/31 23:15

見た感じ「数字」を消したいようにみえますが、「英数字」を消したいのでしょうか?


まし数字だけなら\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>";
?>
    • good
    • 0
この回答へのお礼

ありがとうございます。
解決です!助かりました。

お礼日時:2013/07/31 23:14

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 …
    • good
    • 0

$moji=mb_ereg_replace('[0-9a-zA-Z_]+$', '', $moji);

    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!