![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
ある文章に対して、フォームから入力された文字の部分の色を変えて表示するという事をしたいです。
フォームから入力された文字列が[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で質問しましょう!
似たような質問が見つかりました
- Access(アクセス) Accessのテキストボックスの入力文字制限 1 2023/01/18 20:43
- Visual Basic(VBA) 特定の文字を簡単な操作で半角スペースに変換するか削除したい 2 2022/11/01 10:35
- Excel(エクセル) capeofdragonと申します Excel2016を使っておりまして 半角又は全角の任意文字列が 2 2022/10/31 13:51
- JavaScript フォームが空欄の時にフォームの外をクリックすると、エラーが出るコードを調べています。 1 2023/06/25 11:51
- Excel(エクセル) セルに入力した小文字アルファベット、数字を大文字表示させるには? 3 2022/07/13 10:01
- Access(アクセス) capeofdragonと申します。 Access2016を使っております。 あるフォームがあり、テ 2 2022/09/09 13:18
- その他(Microsoft Office) WordやExcelで英数字のみ半角または全角にしたい 6 2022/08/03 08:18
- その他(ソフトウェア) ソースネクストアプリをインストールし、製品登録で半角英数字が入力できない 5 2022/07/03 22:44
- その他(プログラミング・Web制作) プログラミング pythonの問題について 2 2022/04/19 00:41
- その他(データベース) Accessのクエリで1フィールドの抽出条件設定をNullでなく全角半角含む空白のみの文字列でない文 1 2023/04/24 15:20
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PostgreSQLからCSV形式でエクス...
-
正規表現で数値から始まりYを1...
-
メールフォームが部分的に文字...
-
PHPのsendmailでの文字化けにつ...
-
PHP4.3でapplication/x-javascript
-
SJISからUTFに変換して...
-
UTC-8→SJISで文字化け
-
次のPHPの式で間違っているとこ...
-
PHP+Postgres 「髙」が文字化け
-
携帯とPCにメールを送る(文字...
-
mb_send_mailの2重投稿を防止し...
-
PHPスクリプトでエンコードエラー
-
SQL Serverで文字コードUTF-8
-
SJISで取得した半角カナをUTF-8...
-
よく、書式で出てくる ○○ ( ○○,...
-
mb_internal_encoding('sjis');
-
「あ」→「82A0」のようにshift-...
-
PHP cURLでPOSTした値が文字化...
-
特殊な文字エンコーディングで...
-
VBAのコマンドボタンの文字列の...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
文字化け変換方法
-
phpのメールフォームの完了画面...
-
SQL Serverで文字コードUTF-8
-
UTF8メールがLotus Notesで文字...
-
SJISで取得した半角カナをUTF-8...
-
mail()で送信したメールのタイ...
-
RSSを取得すると文字化けする。
-
includeファイルの文字コードに...
-
phpフォームで携帯へメール送信...
-
PHP+Postgres 「髙」が文字化け
-
廣のjis変換で文字化け
-
小さいひらがな(っ、ょ、ぃ、ゃ...
-
PostgreSQLからCSV形式でエクス...
-
メールのCCに複数のアドレスを...
-
PHPmailerでの添付ファイルの文...
-
ASCII文字列をEUCなどに変換し...
-
mb_convert_encoding で 一部の...
-
SJIS→UTF-8変換後の文字化けに...
-
CGIを作っています。渡されて来...
-
mb_ereg_replace での文字変換
おすすめ情報