- ベストアンサー
マルチバイト文字の大文字、小文字を区別せずに置換
ある文章に対して、フォームから入力された文字の部分の色を変えて表示するという事をしたいです。 フォームから入力された文字列が[php]として、 php、PHP、Php、phP、php、PHP、Php…など、全角、半角、大文字、小文字関係なく色を変えたい場合、 半角の文字列はeregi_replace()でできると思うのですが、全角の場合はどのように記述すれば良いのでしょうか。 フォームから入力された文字列を全角に変換してmb_eregi_replace()を行ってみたのですが、うまくいきませんでした。 文章を半角に変換すればできるとは思いますが、出来る限りそれはしたくありません。 特に一つの関数で…という事は考えていません。 何か良い方法がありましたらアドバイスをお願い致します。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
一応それらしいのを作ってみました。 英文字のみ対応ですが・ それ以外に対応する場合も似たような感じでいけるかと <?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; ?> 結果>:: 全て置き換えられた
その他の回答 (3)
- satoh
- ベストアンサー率77% (17/22)
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系でいいでしょう。
お礼
お礼が遅くなってしまいすみませんでした。 ありがとうございました。
- wipe
- ベストアンサー率52% (37/71)
失礼します。 php、PHP、Php、phP、php、PHP、Phpをすべて同一文字として判定し、処理を実行(色を変える)ということでよろしいでしょうか? もとの文章は$textなどとし保存しておき、処理の判定に使う文字列を$text_change=mb_convert_kana($text)などとして判定、表示するときには元の$textを表示することで対処出来ないのでしょうか? 「色を変えて表示する」という処理と、「全角、半角、大文字、小文字」の関係が分からないので検討違いな回答かもしれません。 具体的な事例を挙げていただけると、説明出来るかもしれません。 お役に立てたら幸いです。
お礼
お礼が遅くなって申し訳ありません。 ありがとうございました。
- wipe
- ベストアンサー率52% (37/71)
失礼します。 関数のリファレンスの中にmb_convert_kana( )というものがあるようです。 オプションによりさまざまな型に変換出来るようです。 現在、半角の文字列の処理文ができているようであれば、 この関数で半角に変換し、半角の処理を実行すれば良いのではないでしょうか。 この関数は大文字/小文字に対応していないのでstrtolower()、strupper()も使用するといいかもしれません。 お役に立てたら幸いです。
お礼
ありがとうございます。 半角に置換すれば上手くいくとは思うのですが、 元の文章が半角全角入り混じった文章なので全角の時に引っかからなくなってしまうのです。 やはり元の文章も半角置換処理をしなければ無理なんでしょうか…
お礼
お礼が遅くなってすみません。 ありがとうございました。