• ベストアンサー

マルチバイト文字の大文字、小文字を区別せずに置換

ある文章に対して、フォームから入力された文字の部分の色を変えて表示するという事をしたいです。 フォームから入力された文字列が[php]として、 php、PHP、Php、phP、php、PHP、Php…など、全角、半角、大文字、小文字関係なく色を変えたい場合、 半角の文字列はeregi_replace()でできると思うのですが、全角の場合はどのように記述すれば良いのでしょうか。 フォームから入力された文字列を全角に変換してmb_eregi_replace()を行ってみたのですが、うまくいきませんでした。 文章を半角に変換すればできるとは思いますが、出来る限りそれはしたくありません。 特に一つの関数で…という事は考えていません。 何か良い方法がありましたらアドバイスをお願い致します。

  • kamay
  • お礼率73% (361/491)
  • PHP
  • 回答数4
  • ありがとう数4

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

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

一応それらしいのを作ってみました。 英文字のみ対応ですが・ それ以外に対応する場合も似たような感じでいけるかと <?php $data=":phpPHPPhpPHPphpPhp:";#ある文章 $order="php";#フォームから(指示)入力された文字 $order=mb_convert_kana ( $order, "a"); #半角に $order_Z=mb_convert_case ($order,MB_CASE_LOWER);#小文字に $order_Z=mb_convert_kana ( $order_Z, "A"); #全角に $order_ZC=mb_convert_case ($order,MB_CASE_UPPER);#大文字に $order_ZC=mb_convert_kana ( $order_ZC, "A"); #全角に $pattern=""; $len=mb_strlen($order); for($i=0;$i<$len;$i++){#パターンを作る $pattern .= '('. mb_substr($order,$i,1).'|'. mb_substr($order_Z,$i,1).'|'. mb_substr($order_ZC,$i,1).')'; } #print "pattern:$pattern\n"; $result=mb_eregi_replace($pattern,"",$data); print $result; ?> 結果>:: 全て置き換えられた

kamay
質問者

お礼

お礼が遅くなってすみません。 ありがとうございました。

その他の回答 (3)

  • satoh
  • ベストアンサー率77% (17/22)
回答No.4

mb_eregiでは半角は大文字小文字区別されないのに全角は区別されてしまうんですねぇ。 1つ賢くなったので、gooID取って回答してみます。 ・作った関数。 function generate_multi_pattern( $pattern ) { $result = ''; $len = mb_strlen( $pattern ); $chars = array(); for( $i = 0; $i < $len; ++$i ){ $chars[] = mb_substr( $pattern, $i, 1 ); } foreach( $chars as $c ){ if( mb_ereg( '[A-Za-z]', $c ) ){ $r = strtoupper( $c ); $r .= strtolower( $c ); $r .= mb_convert_kana( $r, 'R' ); $r = '['. $r .']'; } elseif( mb_ereg( '[A-Za-z]', $c ) ){ $r = mb_convert_case( $c, MB_CASE_UPPER ); $r .= mb_convert_case( $c, MB_CASE_LOWER ); $r .= mb_convert_kana( $r, 'r' ); $r = '['. $r .']'; } elseif( mb_ereg( '[0-9]', $c ) ){ $r = '['. $c . mb_convert_kana( $c, 'N' ) .']'; } elseif( mb_ereg( '[0-9]', $c ) ){ $r = '['. $c . mb_convert_kana( $c, 'n' ) .']'; } elseif( mb_ereg( '[\[\]\|\(\)]', $c ) ){ $r = "\\$c"; } elseif( $c == '\\' ){ $r = '\\\\'; } else { $r = $c; } $result .= $r; } return( $result ); } ・使い方。 // $input_pattern 入力された検索したい文字列(単語) // $target_string 検索対象文字列 // $tag_head 検索した文字列の前につけるタグ // $tag_taill 検索した文字列の後につけるタグ // $result 検索対象を置換後の文字列 $target_string = "フォームから入力された文字列が[php]として、php、PHP、Php、phP、php、PHP、Php…など"; // 勝手に使ってゴメンなさい。 $input_pattern = "php"; $tag_head = '<font color=red>'; $tag_tail = '</font>'; $generated_pattern = generate_multi_pattern( $input_pattern ); $result = mb_ereg_replace( "($generated_pattern)", "$tag_head\\1$tag_tail", $target_string ); ・結果 フォームから入力された文字列が[<font color=red>php</font>]として、<font color=red>php</font>、<font color=red>PHP</font>、 <font color=red>Php</font>、<font color=red>phP</font>、<font color=red>php</font>、<font color=red>PHP</font>、<font color= red>Php</font>…など こんな感じです。全体の処理は見ていただければわかるかと思いますが、generate_multi_pattern()で、検索対象文字列で揺らぎのある英数字に対して[]で囲んだ正規パターンを生成します。でもって全体を()で囲んでmb_ereg_replaceにつっこむと、マッチした部分が\1(""内では\\1)として参照できるので、好きな風に文字列を加えることが出来ます。 ・備考 (1) サニタイズはなーんも考えてないです。実際に使うときは、対処しなければなりません。かなり重要で面倒なので気を付けてください。 (2) pregでパターン修正子にuiを付けると、UTF-8対応大文字小文字同一視状態になります。全角半角は別扱いですが、全角においても大文字と小文字が同一視されるので、パターンは少なくてすみます。 検索対象文字列がUTF-8ならこちらを使うのもよいでしょう。検索対象文字列がUTF-8でないなら、全部変換しなくちゃいけないので、そこまでして使う意味はないと思うので、EUCやShift JISならmb_ereg系でいいでしょう。

kamay
質問者

お礼

お礼が遅くなってしまいすみませんでした。 ありがとうございました。

  • wipe
  • ベストアンサー率52% (37/71)
回答No.2

失礼します。 php、PHP、Php、phP、php、PHP、Phpをすべて同一文字として判定し、処理を実行(色を変える)ということでよろしいでしょうか? もとの文章は$textなどとし保存しておき、処理の判定に使う文字列を$text_change=mb_convert_kana($text)などとして判定、表示するときには元の$textを表示することで対処出来ないのでしょうか? 「色を変えて表示する」という処理と、「全角、半角、大文字、小文字」の関係が分からないので検討違いな回答かもしれません。 具体的な事例を挙げていただけると、説明出来るかもしれません。 お役に立てたら幸いです。

kamay
質問者

お礼

お礼が遅くなって申し訳ありません。 ありがとうございました。

  • wipe
  • ベストアンサー率52% (37/71)
回答No.1

失礼します。 関数のリファレンスの中にmb_convert_kana( )というものがあるようです。 オプションによりさまざまな型に変換出来るようです。 現在、半角の文字列の処理文ができているようであれば、 この関数で半角に変換し、半角の処理を実行すれば良いのではないでしょうか。 この関数は大文字/小文字に対応していないのでstrtolower()、strupper()も使用するといいかもしれません。 お役に立てたら幸いです。

参考URL:
http://www.scollabo.com/banban/php/ref/ref_mb_convert_kana.html
kamay
質問者

お礼

ありがとうございます。 半角に置換すれば上手くいくとは思うのですが、 元の文章が半角全角入り混じった文章なので全角の時に引っかからなくなってしまうのです。 やはり元の文章も半角置換処理をしなければ無理なんでしょうか…

関連するQ&A

  • 文字列前後の「全角空白/半角空白/改行文字」を取り除く

    PHPで、「文字列の前後に付加されている全角空白/半角空白/改行文字を取り除く」 という処理をしたいのですが、以下のように置換処理を書くとうまくいきません。 $after = preg_replace('/^[  \r\n]*(.*)[  \r\n]*$/u', '$1', $before); // [  \r\n]→[半角空白、全角空白、改行文字]です どううまくいかないのかといいますと、入力として半角スペース+全角文字が入ったときに、全角文字の先頭文字が文字化けしてしまいます。 たとえば、 <半角スペース>あああ をこれにかけると、 <よくわからない文字>ああ となります。 以下のように2回に分けてみると、正常に動きます。 $tmp = preg_replace('/[  \r\n]*$/u', '', $before); $after = preg_replace('/^[  \r\n]*/u', '', $tmp); 最初のように1回の正規表現による置換で済ませたい場合、 どのように書くのが適切なのでしょうか? PHPのバージョンは5.2.3です。

    • ベストアンサー
    • PHP
  • 入力フォームの文字変換について

    宜しくお願いします。 フォームで入力された文字をphp上で全角⇔半角変換や、空白の削除などをする方法を教えて下さい。

    • ベストアンサー
    • PHP
  • 文字変換について

    PHP+MYSQLで会員制のサイトを作っています。 文字の扱いについて教えてください。 掲示板等で、入力された文字列の処理についてですが、 入力禁止文字や、半角カナ、全角英文字等の定番的な処理方法はあるのでしょうか? (半角カナは全角に変換すべきとか、) この関数を使うといいよ、とかいうのがあると嬉しいです。 なお、文字コードはeuc-jpです。

    • 締切済み
    • PHP
  • エクセルで半角文字に色を付けるVBA

    エクセルで半角文字を全角に変換しつつ、変換した文字には色を付けるマクロを考えています。 半角→全角の変換はこの記述でできましたが、 myTEXT = StrConv(myTEXT, vbWide) 変換した文字(変換後の文字)に色を付ける、というのが分かりません・・・。 そのような記述は可能でしょうか?お時間あるときにでもご教授いただけると助かります。

  • WORDのワイルドカード置換について

    WORDで、ワイルドカード[0-9]で半角数字を検索し(検索は出来ました)、これを全角数字に置換したいとき、置換後の文字列はどういう風に入力したらよいでしょうか。全角数字の表示形式が分かりません。[0-9]では出来ませんでした。 文字種の変換で行うしかないのでしょうか?

  • パソコンの変換覚えと英語入力について(文字入力で)

    パソコンの変換覚えと英語入力について(文字入力で) 例えば「あう」を変換した時にその前に使ったやつが「会う」だと 次も「会う」が一番に来たりしますよね? で、英語入力でもそうなのですが 英語のみの文章だったら「半角/全角」キーで 半角でやりますが 英語交じりの日本語の文章だと 全角で打つ事も私は多いのですが その際最初が大文字であれば全角で打ってもなんら変わりません。 (小文字から始まると普通に日本語になってしまいますが) ですが、その際最初の頭文字をShiftと同時におして 英語を押し始めると その際の英字の大きさが半角の場合は良いのですが 全角になってる時があります。 そういう場合Word上では半角に変えられないので 私は一度インターネットの検索ボックスの中に 全角で最初大文字で英語を打って Shiftとスペースを同時に押して変換をし、半角にし 再度Wordで打ちます(そうするとそれを覚えてて半角になります) なのですが、最近全角状態で 英語を打って頭文字大文字にして半角で英文が表示される時に 急にもう1回英文を打とうとして Shiftキーと頭文字のキーを同時に押したら全角に戻っていました。 なぜでしょう? これまでも1回覚えさせたら勝手に戻る事はありませんでした。 まぁ時々強制終了した時は戻ったりもしましたが そういう場合は漢字の変換の覚えも全て戻りましたが 英字の全角状態での半角or全角だけが元に戻ってしまいました。 なぜでしょうか?? 分かる方、教えてください。

  • 正規表現:囲われた文字列の置換

    シングルクオーテーションで囲われた文字列のシングルクオーテーションの前に文字を追加するように、正規表現を用いて置換しようと考えています。 全角文字は[^\x01-\x7E]で検索できるのはわかったのですが、シングルクオーテーションで囲われて、全角文字を含む場合という表現ができません。 下記のような、文字列を対象としています。置換をするのは、全角文字を含む文字列のみです。  全角文字のみ  半角文字のみ  全角半角文字両方 下記ののように置換したいです。 置換前: '全角文字や半角文字','testです','test'.'テスト'.'てすとtest','123' 置換後: A'全角文字や半角文字',A'testです','test'.A'テスト'.A'てすとtest','123' よろしくお願いします。

  • Wordで半角を全角に置換した部分を色づけしたい

    Word2000を使用しています。 文章中に半角と全角文字が混在しているので、半角文字を全角に統一したいと思います。「文字種の変換」で半角を全角に変換できますが、変換した部分を 着色してわかるようにすることはできないのでしょうか。 例えば、 「千代田区1-2-3 abcホール」を 「千代田区1-2-3 abcホール」 と変換したい。(『1-2-3 abcホール』の部分を着色) 個々の文字は「置換」で文字を指定すれば、「書式」で色をつけることができるのはわかったのですが、いちいち、文字を指定するのは大変です。いろいろ試したのですが、やはりこれはできないのでしょうか。

  • Excelの置換について

    Excelにおいて、全角英数字で入力されている文字列を一括して半角英数字に変えたいのですが、どうすればいいのでしょうか?

  • php4 大文字小文字の区別なし置換

    お世話になります。 phpを猛学中ですが、なかなかわかりません。 特に正規表現は難解です。 大文字小文字を区別しないで文字列を置換したり、その位置を求めたいのです。 PHP5なら、文字列$htmlの中の</BODY></body></Body>などをを</div>に変換 $html = str_ireplace('</body>','</div>', $html); また、文字列の位置を求める $pos0 = stripos($html, "</body>"); と、いうことで簡単だったのですが、 いざ、サーバへアップしてみるとなんと、そのサーバは、PHP4でした。 それで、動作しなくなってしまいました。 同じことをPHP4で処理するにはどのようにしたらよいのでしょうか。 QNo.4013255などを参考に考えたのですが、どうもだめです。 よろしくお願いします。

    • ベストアンサー
    • PHP

専門家に質問してみよう