おすすめ記事ピックアップ
特殊文字を変換するツールを作ってみようと思い実際に作ってみました。良くある変換ツールは、HTML特殊文字のみを変換するものです。それではつまらないので、自由に指定した文字を変換できるツールを作ってみようと思いました。
初心者の開発メモです。盛大な勘違いがたぶんあります。コードも汚いでしょう。詳しい方いましたら、こうした方が良いぜ!というコメントいただけると嬉しいです。最下部にコードも公開しました。
これは困ったと調べましたら「strtr」で解決しました。連想配列が苦手だったので敬遠したのが良くなかったです。
エンコード方法を調べてみると「htmlspecialchars」、「mb_convert_encoding」、「mb_encode_numericentity」が出てきました。「htmlspecialchars」はHTML特殊文字のみ、「mb_convert_encoding」は日本語のみしか変換できません。なんでも変換する「mb_encode_numericentity」を使うことにしました。
入力してテキストボックスの文字を、ひとつひとつ小間切れにして、取り出せば良いと考えました。「preg_split」で、テキストを分解できました。しかしマルチバイト文字を入力すると、一文字一文字取りだすことができません。「function mb_str_split」で解決しました。
配列の数だけ繰り返すforeach を使いました。これで入力した文字数に連動して、自動で配列を入れる変数を作成できました。
初心者の開発メモです。盛大な勘違いがたぶんあります。コードも汚いでしょう。詳しい方いましたら、こうした方が良いぜ!というコメントいただけると嬉しいです。最下部にコードも公開しました。
制作したmoji encode
http://furimuke.sub.jp/changemoji/
文字の置換について
まず文字の置換方法から考えました。PHPで文字の置換を調べると、「str_replace」や「preg_replace」が出てきます。はじめこれで文字を置換したのですが、どうも結果がおかしいのです。複数置換する文字があると、一つ一つ置換処理されるため、置換されたものが再置換されます。これは困ったと調べましたら「strtr」で解決しました。連想配列が苦手だったので敬遠したのが良くなかったです。
strtrで重複置換の問題を解決
http://www.furimuke.com/2013/11/php-strtr-strreplace-pregreplace-1.html
文字のエンコードについて
次に文字をエンコードする方法を考えました。エンコードとは、文字を文字参照に変換する方法です。エンティティとか文字参照とか実体参照とか、似たような意味で混乱したので、まず名称を整理しました。実体参照が使われることが多いのですが、10進数の文字参照を使うことにしました。エンコード方法を調べてみると「htmlspecialchars」、「mb_convert_encoding」、「mb_encode_numericentity」が出てきました。「htmlspecialchars」はHTML特殊文字のみ、「mb_convert_encoding」は日本語のみしか変換できません。なんでも変換する「mb_encode_numericentity」を使うことにしました。
PHPの文字参照化、エンティティ処理、各方法の違い
http://www.furimuke.com/2013/11/htmlspecialchars-mbconvertencoding-mbencodenumericentity.html
変換する文字について
はじめにチェックボックスで、変換したい文字を指定する方法を考えていました。HTML特殊文字だけども、相当な種類があります。代表的なモノだけとも思ったのですが、なんだかイマイチです。テキストで自由に指定できるようにしようと考えました。入力してテキストボックスの文字を、ひとつひとつ小間切れにして、取り出せば良いと考えました。「preg_split」で、テキストを分解できました。しかしマルチバイト文字を入力すると、一文字一文字取りだすことができません。「function mb_str_split」で解決しました。
mb_split
http://php.net/manual/ja/function.mb-split.php
配列数に応じて配列を作る方法について
プログラム全体の設計図が大体できました。まず変換(置換)させたい文字を入力して、それぞれ「preg_split」分解します。一文字づつ「mb_encode_numericentity」で文字参照します。文字参照する前の文字、文字参照した文字、それぞれを変数に配列として入れます。「strtr」でそれぞれを置換の指定として扱います。これで自由に指定した文字を変換することができました。配列の数だけ繰り返すforeach を使いました。これで入力した文字数に連動して、自動で配列を入れる変数を作成できました。
foreach
http://php.net/manual/ja/control-structures.foreach.php
おまけ文字数制限
フォームエリアに文字数の制限でも付けておこうと思いつけました。下記サイト参考しました。ありがたや。ありがたや。[JavaScript]textareaの文字数制限
http://d.hatena.ne.jp/oinusama/20090421/p2
コード公開
phpファイルを2つに分けています。片方は初めのフォーム、もう片方は計算部分です。参考にどうぞ。初心者のコードなので、微妙だと思います。index.php
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>コード変換</title> </head> <body> <script language="javascript"> function limitMaxLength(target, len, err) { if( target.value.length > len ) { target.value = target.value.substr(0, len); if( "undefined" != typeof(err) ) { alert(err); } } } </script> <!-- formn area--> <form action="cal2.php" method="POST" > <textarea name="text" rows="10" cols="100" onchange="limitMaxLength(this, 30000)"></textarea> <br> <textarea name="c1" rows="10" cols="100" onchange="limitMaxLength(this, 30000)"></textarea> <br> <input type="submit" class="button" value="変換"> <br> </form> <textarea name="text_dm" rows="10" cols="100"></textarea> <br> </body> </html>
cal2.php
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>コード変換</title> </head> <body> <script language="javascript"> function limitMaxLength(target, len, err) { if( target.value.length > len ) { target.value = target.value.substr(0, len); if( "undefined" != typeof(err) ) { alert(err); } } } </script> <?php $c1 = $_POST['c1']; $text = $_POST['text']; function mb_str_split( $c1 ) { return preg_split('/(?<!^)(?!$)/u', $c1 ); } $c1 = mb_str_split( $c1 ); //print_r($c1); ?> <?php $count =0; $str = $c1; $convmap = array(0, 0x10FFFF, 0, 0x10FFFF); foreach ($str as $array_num){ $c1c[$count] = mb_encode_numericentity("$str[$count]", $convmap, 'UTF-8'); $c1c[$count] = htmlspecialchars($c1c[$count]); $count++ ; } ?> <?php $string= $text; $replace = array(); $count =0; foreach ($c1 as $c_num){ $cc = $c1[$count]; $replace[$cc] =$c1c[$count]; $count++ ; } //print_r($replace); $text_encord = strtr($string, $replace); //$text_encord= htmlspecialchars($text); ?> <!-- formn area--> <form action="<?php echo $_SERVER['SCRIPT_NAME'] ?>" method="POST" > <textarea name="text" rows="10" cols="100" onchange="limitMaxLength(this, 30000)"><?php echo htmlspecialchars($_POST['text']); ?></textarea> <br> <textarea name="c1" rows="10" cols="100" onchange="limitMaxLength(this, 30000)"><?php echo htmlspecialchars($_POST['c1']); ?></textarea> <br> <input type="submit" class="button" value="変換"> <br> <textarea name="text2" rows="10" cols="100"><?php echo $text_encord; ?></textarea> </form> <br> </body> </html>
制作したmoji encode
http://furimuke.sub.jp/changemoji/