元祖若手のプログラミング奮闘記

元祖若手の奮闘記。主にメモ

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;
    }
    
?>