[PHP-users 4824] Re: 記号文字を判別するには?

GUU php-users@php.gr.jp
Fri, 18 Jan 2002 14:17:47 +0900


こんにちわ

PHPはじめて、一週間なものなので、PHP的回答は出来ないのですが、少しはお力
になれるかもしれないと思い投稿します。

PHPの正規表現がどのぐらいのものなのかは、まだ使い込んでいないのでわかり
ませんが、以前のASP案件で、入力フォーム上で、入力直後に半角文字が入って
いたら、全角文字に変換するという機能を要求されたことがあったので、その時
に作ったJavaScriptの関数を見つけたので、投稿します。
PHPで、判断関数を作るのに参考になれば幸いです。(PHPそのもでなくて申し訳
ないです)

また、関数の性質上、半角カタカナが流れてしまうことをご容赦ください

----------------------ここから------------------------------------
/* ---------------------------------------------
	名称	:fncFormatWithEnd(String)
	機能	:全角文字に変換する
	引数1	:対象文字列
	戻値	:変換後文字列
	備考	:改行は殻も字に変換。濁音半濁音は存在しない物は無変換 
--------------------------------------------- */
function fncConvZenkaku(strWord){
	var reg = /([\0-\255。-°])/;		//半角文字を検索
	var lngPoint=0;					//変換ポインタ
	var strRetrun="";				//戻り値
	var lngCode=0;					//変換対象コード
	var strMoji="";					//変換対象文字
	var strTmp="";					//変換後の文字
	var intShift=0;					//文字ずらし幅
	var mapHalf="。「」、・ヲァィゥェォャュョッーアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン";
	var mapAll="。「」、・ヲァィゥェォャュョッーアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン";
	var mapDakuH="カキクケコサシスセソタチツテトハヒフヘホウ";
	var mapDakuA="ガギグゲゴザジズゼゾダヂヅデドバビブベボヴ";
	var mapHdakuH="ハヒフヘホ";
	var mapHdakuA="パピプペポ";
	
	
	while((lngPoint=strWord.search(reg))>=0){
		strRetrun=strRetrun + strWord.substring(0,lngPoint);				//全角文字退避
		
		strMoji=strWord.charAt(lngPoint);
		lngCode=strWord.charCodeAt(lngPoint);								//変換対象コード取得

		//変換マップ
		if(strMoji=="\n"){							//改行
			strTmp="";
			intShift=1;
		}else{
		if(strMoji==" "){							//スペース
			strTmp=" ";
			intShift=1;
		}else{
		if(lngCode==92){							//\マーク
			strTmp="¥";
			intShift=1;
		}else{
		if(strMoji=="'"){
			strTmp="’";
			intShift=1;
		}else{
		if(lngCode>=33 && lngCode<=126){			//英数記号
			strTmp=String.fromCharCode(lngCode+65248);
			intShift=1;
		}else{
		if(lngCode>=65377 && lngCode<=65437){			//カタカナ
			switch(strWord.charAt(lngPoint+1)){
				case "″":
					lngTmp=mapDakuH.search(strMoji);
					if(lngTmp==-1){
						lngTmp=mapHalf.search(strWord.charAt(lngPoint));
						strTmp=mapAll.charAt(lngTmp);
						intShift=1;
					}else{	
						strTmp=mapDakuA.charAt(lngTmp);
						intShift=2;
					}
					break;
				case "°":
					lngTmp=mapHdakuH.search(strMoji);
					if(lngTmp==-1){
						lngTmp=mapHalf.search(strWord.charAt(lngPoint));
						strTmp=mapAll.charAt(lngTmp);
						intShift=1;
					}else{
						strTmp=mapHdakuA.charAt(lngTmp);
						intShift=2;
					}
					break;
				default:
					lngTmp=mapHalf.search(strWord.charAt(lngPoint));
					strTmp=mapAll.charAt(lngTmp);
					intShift=1;
			}
		}else{
			strTmp=strMoji;
			intShift=1;
		}
		}
		}
		}
		}
		}
		strRetrun=strRetrun+strTmp;					//戻り値に変換文字を追
		strWord=strWord.substring(lngPoint+intShift,strWord.length);		//検索対象文字列作成

	}
	strRetrun=strRetrun+strWord;
	return strRetrun;
}
----------------------ここまで--------------------------------
/////////////////////////////////////////

               guu-ml@reguler-c.com

/////////////////////////////////////////