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行目辺りで頑張ってガリガリ分割しています。
- もしこれをコピーする場合に注意して欲しいことは、貼りつけた際にすべての文字が文字化けていないかという点です。文字化けて ? などが入ってしまうと、どんな文字でもひっかかるというバグが発生します。
参考にしたページ一覧
- PHP: 正規表現パターンに使用可能な修飾子 – Manual
- PHP: preg_match – Manual
- PHP 正規表現の基本 (preg_match) – どうにかなるBLOG
- PHP正規表現での質問です。 preg_match_allを使って機種依存文字… – tukihatuの技術日記
- PHPでマルチバイト文字列を1文字ずつ配列に分割したいのですが、str_split(文字列… – Yahoo!知恵袋
とおりすがり2010-7-14 (水) 11:13:43
「飯」とか機種依存文字じゃない文字が含まれているようです。