PHPの正規表現でWARNINGがでまくったのでとめた。
こんなコードを書いていたら
WARNINGがでまくったので
<?php public function validateWords($word_list = array()){ $pattern = implode('', array( "\x{3041}-\x{3094}", //ひらがな "\x{30A1}-\x{30F3}", //カタカナ "\x{4E00}-\x{9FFF}", //漢字 "\x{F900}-\x{FAFF}", //漢字 "\x{FF01}-\x{FF5A}", //全角記号、全角英数字 "a-zA-z0-9Α-Ωα-ω¢£" )); $result = array(); foreach ($word_list as $word){ if (preg_match('/[^'. $pattern .']/', $word)){ $result[] = $word; } } } return $result; ?>
そしてこんな感じでWARNINGがでた
Warning: pregmatch() [function.preg-match]: Compilation failed: invalid range in character class at offset 13
まぁ範囲の指定がUnicodeとa-zとかごちゃってるからな
ってことで
全部統一してみる
だがしかしWARNINGは止まらない
そして気づく。
「そういえばこれEUC-JPやんけ。。」
ってことで修正
<?php public function validateWords($word_list = array()){ $pattern = implode('', array( "\x{0030}-\x{0039}", //半角数 "\x{0041}-\x{005A}", //半角英小 "\x{0061}-\x{007A}", //半角英大 "\x{3041}-\x{3094}", //ひらがな "\x{30A1}-\x{30F3}", //カタカナ "\x{4E00}-\x{9FFF}", //漢字 "\x{F900}-\x{FAFF}", //漢字 "\x{FF01}-\x{FF5A}", //全角記号、全角英数字 "\x{FFE0}\x{FFE1}" //セント、ポンド )); $result = array(); foreach ($word_list as $word){ $str = mb_convert_encoding($str, "UTF-8", "EUC-JP"); // UTF-8へ変換 if (preg_match('/[^'. $pattern .']/u', $str)){ //u修飾子をつけ忘れないように $result[] = $word; } } return $result; } ?>
WARNING止まった!!!!
だが待つんだ
喜ぶのはまだ遅かった
全角のマイナスとセント、ポンドがなぜか
NGワードでひっかかる
ってことで
UTF-8に変換したところでvar_dump
なんと半角に変換されていた。。。。
-¢£ => -¢£
ってことなので
範囲を追加。
下のやつでおしまい。
<?php public function validateWords($word_list = array()){ $pattern = implode('', array( "\x{0030}-\x{0039}", //半角数 "\x{0041}-\x{005A}", //半角英小 "\x{0061}-\x{007A}", //半角英大 "\x{3041}-\x{3094}", //ひらがな "\x{30A1}-\x{30F3}", //カタカナ "\x{4E00}-\x{9FFF}", //漢字 "\x{F900}-\x{FAFF}", //漢字 "\x{FF01}-\x{FF5A}", //全角記号、全角英数字 "\x{FFE0}\x{FFE1}" //セント、ポンド "\x{2D}\x{A2}\x{A3}" )); $result = array(); foreach ($word_list as $word){ $str = mb_convert_encoding($str, "UTF-8", "EUC-JP"); // UTF-8へ変換 if (preg_match('/[^'. $pattern .']/u', $str)){ //u修飾子をつけ忘れないように $result[] = $word; } } return $result; } ?>