PHP で機種依存文字をフィルタリングする関数を作ってみた

PHP で機種依存文字をフィルタリングするのはかなり大変でした、当初は正規表現など使って3行くらいで書けてしまうだろうと思っていたのですが、なぜかうまく引っかからなかったりとたくさんのバグや問題にぶつかり、最後消去法で辿り着いたような関数なので、改良の余地があればどんどん教えてください。

以下、格好付けて説明していきます。

説明

1
platform_dependent_characters_filter(string $text)

引数に文章を渡します。複数行でも構いません。機種依存文字が含まれていれば、true を、含まれていなければ false を返します。

例を紹介しますと。

1
2
3
4
5
if(platform_dependent_characters_filter(string $text)) {
   echo 'エラー!機種依存文字が含まれています。';
} else {
   echo '機種依存文字が含まれていませんでした。';
}

コード

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function platform_dependent_characters_filter($text) {
 
	mb_regex_encoding('UTF-8');
 
	$pdc = '①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑯⑰⑱⑲⑳ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩ㍉㌔㌢㍍㌘㌧㌃㌶㍑㍗㌍㌦㌣㌫㍊㌻㎜㎝㎞㎎㎏㏄㎡㍻〝〟№㏍℡㊤㊥㊦㊧㊨㈱㈲㈹㍾㍽㍼∮∟⊿纊褜鍈銈蓜俉炻昱棈鋹曻彅丨仡仼伀伃伹佖侒侊侚侔俍偀倢俿倞偆偰偂傔僴僘兊兤冝冾凬刕劜劦勀勛匀匇匤卲厓厲叝﨎咜咊咩哿喆坙坥垬埈埇﨏塚增墲夋奓奛奝奣妤妺孖寀甯寘寬尞岦岺峵崧嵓﨑嵂嵭嶸嶹巐弡弴彧德忞恝悅悊惞惕愠惲愑愷愰憘戓抦揵摠撝擎敎昀昕昻昉昮昞昤晥晗晙晴晳暙暠暲暿曺朎朗杦枻桒柀栁桄棏﨓楨﨔榘槢樰橫橆橳橾櫢櫤毖氿汜沆汯泚洄涇浯涖涬淏淸淲淼渹湜渧渼溿澈澵濵瀅瀇瀨炅炫焏焄煜煆煇凞燁燾犱犾猤猪獷玽珉珖珣珒琇珵琦琪琩琮瑢璉璟甁畯皂皜皞皛皦益睆劯砡硎硤礰礼神祥禔福禛竑竧靖竫箞精絈絜綷綠緖繒罇羡羽茁荢荿菇菶葈蒴蕓蕙蕫﨟薰蘒﨡蠇裵訒訷詹誧誾諟諸諶譓譿賰賴贒赶﨣軏﨤逸遧郞都鄕鄧釚釗釞釭釮釤釥鈆鈐鈊鈺鉀鈼鉎鉙鉑鈹鉧銧鉷鉸鋧鋗鋙鋐﨧鋕鋠鋓錥錡鋻﨨錞鋿錝錂鍰鍗鎤鏆鏞鏸鐱鑅鑈閒隆﨩隝隯霳霻靃靍靏靑靕顗顥飼餧館馞驎髙髜魵魲鮏鮱鮻鰀鵰鵫鶴鸙黑ⅰⅱⅲⅳⅴⅵⅶⅷⅸⅹ¬¦'"';
	$pdc_array = Array();
	$pdc_text = str_replace(array("\r\n","\n","\r"), '', $text);
 
	while($iLen = mb_strlen($pdc, 'UTF-8')) {
		array_push($pdc_array, mb_substr($pdc, 0, 1, 'UTF-8'));
		$pdc = mb_substr($pdc, 1, $iLen, 'UTF-8');
	}
 
	foreach($pdc_array as $value) {
		if(preg_match("/(" . $value . ")/", $pdc_text)) {
			return true;
			break;
		}
	}
	return false;
}
  • 複数行に対して preg_match() で検索をかけることができなかったため、そもそも検索をかける文章の改行を7行目で除去してチェックをしています。助けて!
  • $pdc にチェックしたい文字列を入れて行きます。1文字ずつにしか対応しておりません。
  • str_split() がマルチバイトに対応していなかったので、9行目辺りで頑張ってガリガリ分割しています。
  • もしこれをコピーする場合に注意して欲しいことは、貼りつけた際にすべての文字が文字化けていないかという点です。文字化けて ? などが入ってしまうと、どんな文字でもひっかかるというバグが発生します。

参考にしたページ一覧

コメント

  1. とおりすがりさんのコメント

    「飯」とか機種依存文字じゃない文字が含まれているようです。

  2. webleさんのコメント

    「飯」で引っかかって私も困りましたので消してみました。
    報告頂きありがとうございました!

  3. とおりすがりさんのコメント

    以前書き込みさせて頂いたとおりすがりです。
    「飯」の他にも「館」とか、まだいくつかあるようです。
    「飯」を消してしまうのではなく、「飯」→「飯」、
    「館」→「館」のように本来の機種依存文字に変更したら良いと思います。

    私は、$pdcのところを次のようにして利用させて頂いています。

    $pdc = ‘①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩ’;
    $pdc .= ‘㍉㌔㌢㍍㌘㌧㌃㌶㍑㍗㌍㌦㌣㌫㍊㌻㎜㎝㎞㎎㎏㏄㎡’;
    $pdc .= ‘㍻〝〟№㏍℡㊤㊥㊦㊧㊨㈱㈲㈹㍾㍽㍼∮∑∟⊿’;
    $pdc .= ‘纊褜鍈銈蓜俉炻昱棈鋹曻彅丨仡仼伀伃伹佖侒侊侚侔俍偀倢俿倞偆偰偂傔僴僘兊兤冝冾凬刕劜劦勀勛匀匇匤’;
    $pdc .= ‘卲厓厲叝﨎咜咊咩哿喆坙坥垬埈埇﨏塚增墲夋奓奛奝奣妤妺孖寀甯寘寬尞岦岺峵崧嵓﨑嵂嵭嶸嶹巐弡弴彧德’;
    $pdc .= ‘忞恝悅悊惞惕愠惲愑愷愰憘戓抦揵摠撝擎敎昀昕昻昉昮昞昤晥晗晙晴晳暙暠暲暿曺朎朗杦枻桒柀栁桄棏﨓楨’;
    $pdc .= ‘﨔榘槢樰橫橆橳橾櫢櫤毖氿汜沆汯泚洄涇浯涖涬淏淸淲淼渹湜渧渼溿澈澵濵瀅瀇瀨炅炫焏焄煜煆煇凞燁燾犱’;
    $pdc .= ‘犾猤猪獷玽珉珖珣珒琇珵琦琪琩琮瑢璉璟甁畯皂皜皞皛皦益睆劯砡硎硤硺礰礼神祥禔福禛竑竧靖竫箞精絈絜’;
    $pdc .= ‘綷綠緖繒罇羡羽茁荢荿菇菶葈蒴蕓蕙蕫﨟薰蘒﨡蠇裵訒訷詹誧誾諟諸諶譓譿賰賴贒赶﨣軏﨤逸遧郞都鄕鄧釚’;
    $pdc .= ‘釗釞釭釮釤釥鈆鈐鈊鈺鉀鈼鉎鉙鉑鈹鉧銧鉷鉸鋧鋗鋙鋐﨧鋕鋠鋓錥錡鋻﨨錞鋿錝錂鍰鍗鎤鏆鏞鏸鐱鑅鑈閒隆’;
    $pdc .= ‘﨩隝隯霳霻靃靍靏靑靕顗顥飯飼餧館馞驎髙髜魵魲鮏鮱鮻鰀鵰鵫鶴鸙黑’;
    $pdc .= ‘ⅰⅱⅲⅳⅴⅵⅶⅷⅸⅹ¦'"’;
    // except ≒≡∫√⊥∠∵∩∪¬

    • webleさんのコメント

      書き込みありがとうございます。文字化けフィルターが上手く動かなかったので放置しておりましたが、改善点をお教え頂けたみたいで嬉しく思います。

      一度動作確認等を行い、問題なければ記事を修正しそれに塗り替えさせて頂きます。ありがとうございます!