正規表現で全角文字を削除する方法とは?

このQ&Aのポイント
  • 正規表現を使ってアスキーコード文字以外の全角文字を削除する方法について教えてください。
  • mb_ereg_replaceを使用して英小文字以外の全角文字を削除しようとしたが、ユーロ記号が削除できないという問題が発生しました。
  • ブラウザから送られてくるデータに含まれるユーロ記号を削除する方法や、アスキーコード以外の全角文字を削除する方法について詳しく教えてください。
回答を見る
  • ベストアンサー

正規表現で全角文字を全て削除したい

正規表現を使ってアスキーコード文字以外の全角文字を全て削除しようとしたのですが、ユーロ記号 € が削除できませんでした。 以下は英小文字以外全て削除しようとしたものです。 英小文字以外や全角文字は削除できているようですが、ユーロ記号が削除されません。 mb_ereg_replace ('[^a-z]', "", $str); error_logを使って確認してみるとそもそもブラウザから送られてきたきた時点で &#8364; となっています。(ユーロ記号そのものがこの場に表示されてしまうので全角で明記していますが実際は7文字全て半角です。) これが正しい挙動なのかどうかも判断がつきかねています。(コード番号そのものはユーロ記号のようですが) error_log($_POST['moji'], 0); 以下のようにアスキーコード以外全て削除という指定も削除されませんでした。 &#8364; をアスキーコード7文字として一つ一つ処理しているようです。 mb_ereg_replace ('[^\x00-\x7f]', "", $str); ちなみにこの &#8364; の入った $str をHTMLを使いブラウザに出力してやるとちゃんとユーロ記号が表示されます。 <pre>{$str}</pre> mb_internal_encodingやmb_regex_encodingの設定などいろいろ試してみたのですがうまくいきませんでした。 この文章を書いていて今思ったのですが、ひょっとしてまず &#と; で挟まれたものを削除するというのがこの問題の一般的な解決方法なのでしょうか。そうすればユーロ記号 &#8364; も削除できますし。もしそうならその辺の事情も解説あるいはURL明記していただけると助かります。 (でもこれ、アスキーコードは残したい場合にたまたま &#8364; というユーロ記号を意図しないただの半角7文字の文が入力されてきてしまっても削除されるということになっちゃいますね。これはやっぱりしょうがないのですかね。) よろしくお願いします。

  • PHP
  • 回答数2
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • salsberry
  • ベストアンサー率69% (495/711)
回答No.2

ユーロ記号は「全角文字」なのか?という疑問は置いといて... 以下、半角の&記号を全角の&で置き換えて書きます。 &#~;で表すのは数値文字参照と言います。~の部分は10進数とは限らず、16進数も使われます。このため&#8364;と&#x20AC;は同じ文字を表します。 また、ユーロ記号は文字実体参照を使って&euro;という表し方もできます。 一方で、ASCIIの範囲にある文字が文字実体参照で表される場合があります(&→&amp;、 >→&gt;)。あまりやらないでしょうが、数値文字参照で表すこともできます(A→&#65;)。 つまり、&と;に挟まれた内容を確認せずに削除してしまうと、数値文字参照や文字実体参照で表されたASCIIの範囲内の文字まで消えてしまうことになります。 ・入力に数値文字参照がある場合、&#と;の間の数値を確認し、その値が128以上だったら&#~;を削除する ・入力に文字実体参照がある場合、それが表す文字がASCIIの範囲内かどうかをチェックし、範囲外だったら&~;を削除する(ASCIIの範囲内の文字に対して定義されている文字実体参照は数が限られているので全数チェック可能) というような方針で対応すればいいのではないでしょうか。 > たまたま &#8364; というユーロ記号を意図しないただの半角7文字の文が入力されてきてしまっても ユーロ記号が&#8364;で表されるような入力であれば、「&#8364;」という文字列は「&amp;#8364;」と表されると思う(未確認)のでその心配は無用でしょう。

参考URL:
http://ja.wikipedia.org/wiki/%E6%96%87%E5%AD%97%E5%8F%82%E7%85%A7
ankodaisuki
質問者

お礼

回答ありがとうございます。 とても参考になりました。

その他の回答 (1)

  • SAYKA
  • ベストアンサー率34% (944/2776)
回答No.1

ユーロ記号はunicodeだとおもうけど phpとかのエンコーディングがunicodeになってないとか・・・

ankodaisuki
質問者

お礼

回答ありがとうございます。 参考にさせていただきます。

関連するQ&A

  • mb_ereg_replace での文字変換

    PHPでフリーの掲示板を制作中です。 目立たせようとする記号を削除しましたがうまく動きません。 $html = mb_ereg_replace('△', '', 'あああ△あああ'); ・希望結果 ああああああ ・実際の結果 ああ 文字コードは全て EUC-JP です。 また以下を追加するとエラーがでました。 $str="あああ△あああ"; $str = mb_convert_encoding($str, 'EUC-JP', 'auto'); ・エラー Warning: mb_convert_encoding() [function.mb-convert-encoding]: Unable to detect character encoding in そもそもmb_convert_encodingを使わない方が良いのか使い方が悪いのかも解りませんがアドバイスお願いします。

    • ベストアンサー
    • PHP
  • 半角¥を全角¥に変換するために

    <?PHP mb_language('ja'); mb_internal_encoding('utf-8'); $str="ok\\ok<br/>"; echo$str; mb_ereg_replace('\\','¥',$str); echo$str; ?> としましたがエラーになりうまくいきません どう修正したらいいでしょうか?

    • ベストアンサー
    • PHP
  • IMAP関数で取得した文字列の、文字コード変更について

    IMAP関数で取得した文字列(MAILBODYやSUBJECTなど)の文字コードは変えられないのでしょうか? もともとの文字コードはASCIIであることは確認しているのですが、 $str=mb_convert_encoding($str,"UTF-8"); を行っても、ASCIIのまま変更することができません。 なにかコツのようなものをご存知でしたらお教え願えればと思います よろしくお願いします。

    • 締切済み
    • PHP
  • 正規表現での置換えについて

    正規表現を使った置換えでどうやったらいいのか悩んでいます。 やり方は、カンマで区切られた数字や英字の列をその先頭だけ残して別の記号(?など)に変換するというものです。 変換例 222,1,33333 は 2??,1,3???? へ置換え 55,22aa は 5?,2??? へ置換え 6 は 6 へ置換え(つまりそのまま) このような置換えをすることは可能でしょうか。 こういう置換えはand条件が使えないと無理なのかなとも思ったりしています。 ただ正規表現にはand条件は無いようですし。(or条件はあるようですが) mb_ereg_replaceを使って明示していただけると助かります。 もちろん複数行になっても問題ありませんし、mb_ereg_replaceでは無理という場合に別の関数を使っていただいても結構です。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • エスケープ文字そのものにマッチさせる正規表現

     お世話になっております。  PHPの正規表現でエスケープ文字\そのものにマッチさせる正規表現がなかなか作れません。Perl互換のpreg_replaceなども試してみましたがダメでした。エスケープ文字そのものを削除したいのですが、どうしたらよいでしょうか? $value = ereg_replace ('\\', '', $value);//ダメでした。 $value = preg_replace ('/\\/', '', $value);//同様にダメでした。 $value = preg_replace ('/[\\]/', '', $value);//同様にダメでした。  文字列中に\が入っていたり、単独で\があった場合は必要ないので削除するといった感じです。 $value = ereg_replace ('[][}}{)(!"#$%&\\~|*+,/\^\'<>`;:?\\=]', '', $value); これでいけるかと思ったのですが、\だけ残ってしまいます。最後辺りの\\で\文字それ自体にマッチするかと思うんですが…。 わかる方がいらしたらおしえてください。よろしくお願いします。

    • ベストアンサー
    • PHP
  • 正規表現ereg_replaceで、ダブルクオートの中身をカットしたい

    AAA"BBBBBB"CCCCCEF KKK"ABBCBBCKE"DDDDDEFG といった文字列があるのですが、これを AAACCCCCEF KKKDDDDDEFG この様に、"~"の中身をダブルクオートも含め全てカットしたい場合、ereg_replaceを使った方法を教えて下さい。 $str = ereg_replace("\"","",$str); だと当然ダブルクオートの中身までは外れてくれないので…。

    • ベストアンサー
    • PHP
  • 正規表現を使った全角文字のチェック。

    現在入力項目が全角文字OR半角スペースかどうかチェックする、スクリプトをBASP21を使って下のようなコードを作っています。VBSで色々試しましたができません。 本番では、BASAP21が使えないので困っています。 処理としては、入力値が、シフトJISの全角に当たる文字コードかどうかチェックしています。 BASP21を使わない方法で可能でしょうか? また可能であれば方法を教えてください。 環境:WindowsXPSP2 VBScript IIS LOCALHOST上で実行しています。 例: str = " あいうえおア " Set bobj = CreateObject("basp21") output = bobj.Match("/^(?:[\x81-\xEF][\x40-\xFC]|\x20)+$/",str) IF output = 0 THEN Response.Write("全角で入力して下さい。") END IF

  • PHPの正規表現で【】内を文字列ごと削除

    あいうえお【かきく】けこさ。【しすせそ】 といった感じの文字列を、【かきく】や【しすせそ】を削除して、 ”あいうえお けこさ。” としたいのですが・・・ $str = preg_replace("【.*】"," ",$str) とすると、 あいうえお ってなっちゃうし、 $str = preg_replace("/【.{1,5}?】/"," ",$str) とかやってみても上手く行かず。 はて?「/」は何を意味するのだろう。とか思いながら試行錯誤してはみてるのですが・・・ どなたかご教授くださいませんでしょうか。 お願いします。

    • ベストアンサー
    • PHP
  • 正規表現

    質問させていただきます。 文字コード「Shift-JIS」で渡ってきた文字列を 英字とスペースはOKで、 それ以外の文字列が入力されていたら、エラーいう処理を しているのですが、うまくいきません。 ご教授よろしくお願いします。 // 半角にする $kana = mb_convert_kana($_POST['kana'], "r"); if ((ereg("^[a-zA-Z]+$", trim($kana))) == false) {   echo "エラーです"; } 全角スペースと半角スペースと英字はOKで、それ以外はNG としたいです。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • 【PHP】半角「\」を全角「¥」に変換したい(2)

    同じ過去の質問を見つけたのですが、実行してみたところできなかったので相談させてください。【過去質問】:http://oshiete1.goo.ne.jp/qa3065958.html PHP Version 4.4.6、文字コードはshift-JISです。 アンケートフォームで入力された値を受け取り、半角「\」があれば全角「¥」に置換したいのですが、上手くいきません。 試したのは下記の方法です。 [1]  $str = preg_replace("\\", "¥", $str); [2]  $str = mb_ereg_replace("\\\\", '¥', $str); [3]  $str = preg_replace("/\\\\/", '¥', $str); 同じ質問をされている方は文字コードが「UTF-8」で上記の[2][3]で上手くいっているようなので、文字コードを変更すればいいのかもしれませんが、現在あるフォームを修正しているので、できればshift-JISでしたい・・・と模索中です。 また、サイトの性質上「○○円の~」というようなメッセージが多いので、¥を削除することはできるだけ避けたいです。 ご指導をお願いいたします。

    • ベストアンサー
    • PHP

専門家に質問してみよう