ある文章に対して、フォームから入力された文字の部分の色を変えて表示するという事をしたいです。
フォームから入力された文字列が[php]として、
php、PHP、Php、phP、php、PHP、Php…など、全角、半角、大文字、小文字関係なく色を変えたい場合、
半角の文字列はeregi_replace()でできると思うのですが、全角の場合はどのように記述すれば良いのでしょうか。
フォームから入力された文字列を全角に変換してmb_eregi_replace()を行ってみたのですが、うまくいきませんでした。
文章を半角に変換すればできるとは思いますが、出来る限りそれはしたくありません。
特に一つの関数で…という事は考えていません。
何か良い方法がありましたらアドバイスをお願い致します。
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;
?>
結果>::
全て置き換えられた
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系でいいでしょう。
No.2
- 回答日時:
失礼します。
php、PHP、Php、phP、php、PHP、Phpをすべて同一文字として判定し、処理を実行(色を変える)ということでよろしいでしょうか?
もとの文章は$textなどとし保存しておき、処理の判定に使う文字列を$text_change=mb_convert_kana($text)などとして判定、表示するときには元の$textを表示することで対処出来ないのでしょうか?
「色を変えて表示する」という処理と、「全角、半角、大文字、小文字」の関係が分からないので検討違いな回答かもしれません。
具体的な事例を挙げていただけると、説明出来るかもしれません。
お役に立てたら幸いです。
No.1
- 回答日時:
失礼します。
関数のリファレンスの中にmb_convert_kana( )というものがあるようです。
オプションによりさまざまな型に変換出来るようです。
現在、半角の文字列の処理文ができているようであれば、
この関数で半角に変換し、半角の処理を実行すれば良いのではないでしょうか。
この関数は大文字/小文字に対応していないのでstrtolower()、strupper()も使用するといいかもしれません。
お役に立てたら幸いです。
参考URL:http://www.scollabo.com/banban/php/ref/ref_mb_co …
ありがとうございます。
半角に置換すれば上手くいくとは思うのですが、
元の文章が半角全角入り混じった文章なので全角の時に引っかからなくなってしまうのです。
やはり元の文章も半角置換処理をしなければ無理なんでしょうか…
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
文字化け変換方法
-
UTF8メールがLotus Notesで文字...
-
PHPmailerでの添付ファイルの文...
-
multipart/form-dataの文字化け
-
PHP+Postgres 「髙」が文字化け
-
SelectedIndexChanged
-
【PHP】半角「\\」を全角「...
-
SJISで取得した半角カナをUTF-8...
-
Warning: mb_strpos(): Unknown...
-
送信したメールのタイトルが無...
-
PHPスクリプトでエンコードエラー
-
PHPアクセスログ バッチ処理
-
PHP cURLでPOSTした値が文字化...
-
機種依存文字が?になる
-
メール送信の設定について
-
記号だけの文字化け対応について
-
includeファイルの文字コードに...
-
mb_ereg_replace での文字変換
-
複数サイトの一括管理
-
エンコード UTF-8
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
文字化け変換方法
-
SQL Serverで文字コードUTF-8
-
PHPmailerでの添付ファイルの文...
-
SJISで取得した半角カナをUTF-8...
-
UTF8メールがLotus Notesで文字...
-
RSSを取得すると文字化けする。
-
「あ」→「82A0」のようにshift-...
-
【PHP】mb_convert_encoding...
-
メールのCCに複数のアドレスを...
-
postの文字化け防止について
-
PHP+Postgres 「髙」が文字化け
-
SJIS→UTF-8変換後の文字化けに...
-
記号だけの文字化け対応について
-
phpMyAdmin内での文字化け
-
送信したメールのタイトルが無...
-
phpのメールフォームの完了画面...
-
SJISからUTFに変換して...
-
sjisの文字化けとその対処方法...
-
メール題名の文字化け
-
セッションが文字化け、エンコ...
おすすめ情報