奇特なブログ

「殊勝に値する行いや心掛け」を意味する、奇特な人になる為のブログです

この正規表現は、どんな文字がマッチするのか調べたい時など

※PHP7.2以上じゃないと動かない関数を使ってます


主目的としては、タイトルの通りですが「この正規表現って、どんな文字ならマッチするの?」って初見で思う様な、

パッと見複雑な正規表現を見る時が、ちょいちょいあるわけですよ。

だから、そういう時に使えるかなと。

また、タイトル以外の目的として、

「ファイル名をチェックする正規表現」というのもあるんですけどね。

ただ、この正規表現は許可したい文字を定義しているので、

ここから、ちょこちょこ調整が必要とは思いますけど。特に「記号(カオス過ぎますね)」は。

あと、そもそもファイル名以外のチェックの正規表現でも使えるかもしれないですね。

ただ、正規表現使わなくても、配列のキーをコードポイント値にして、
許可したい文字の配列を定義してチェックとかでも良いんでしょうけどね。

<?php

// これをしないと、だいぶ時間がかかるので
ini_set('memory_limit', '-1');

$result = '';

// 許容する文字
// Unicodeのコードポイント値は、 https://ja.wikipedia.org/wiki/Unicode%E4%B8%80%E8%A6%A7%E8%A1%A8 参照
$white_list = '/\A(?:[';
// ひらがな
$white_list .= '\x{3041}-\x{3096}';
// カタカナ
$white_list .= '\x{30A1}-\x{30FA}\x{31F0}-\x{31FF}\x{FF66}-\x{FF6F}\x{FF71}-\x{FF9D}';
$white_list .= '][';
// 濁点・半濁点
$white_list .= '\x{3099}\x{309A}';
$white_list .= ']?|';
// 長音
$white_list .= '\x{30FC}';
$white_list .= '|';
// 漢字(一部の文字は\p{Han}でも良いけど、明示的な方が良いかと)
$white_list .= '[\x{2E80}-\x{2FDF}\x{3005}\x{3007}\x{3021}-\x{3029}\x{3038}-\x{303B}\x{3400}-\x{4DBF}\x{4E00}-\x{9FFF}\x{F900}-\x{FAFF}\x{20000}-\x{2FFFF}][\x{E0100}-\x{E01EF}\x{FE00}-\x{FE02}]';
$white_list .= '?|';
// 全角英数字・半角英数字
$white_list .= '[a-zA-Z0-9a-zA-Z0-9]';
$white_list .= '|[';
// 以下の全角記号(エディタによっては半角に見えます)と全角スペース
// ‐ ― ‖ ‘ ’ “ ” ′ ″ ※   、 。 〈 〉 《 》 「 」 『 』 【 】 〒 〔 〕 〖 〗 〜 〝 ! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _ ` { | } ~ ¥
$white_list .= '\x{2010}\x{2015}\x{2016}\x{2018}\x{2019}\x{201C}-\x{201D}\x{2032}\x{2033}\x{203B}\x{3000}-\x{3002}\x{3008}-\x{3012}\x{3014}-\x{3017}\x{301C}-\x{301D}\x{FF01}-\x{FF0F}\x{FF1A}-\x{FF20}\x{FF3B}-\x{FF40}\x{FF5B}-\x{FF5E}\x{FFE5}';
$white_list .= ']|';
// アンダーバー・半角スペース・ドット
$white_list .= '[_ .]';
$white_list .= ')+\z/u';

var_dump($white_list);

for ($i = 0; $i <= 0x10FFFF; $i++) {
        // 1文字ずつ取得して、マッチしていたら出力対象に
        $str = mb_chr($i, 'UTF-8');
        if (1 === preg_match($white_list, $str)) {
                $result .= $i . ':' . dechex($i) . ':' . $str . PHP_EOL;
        }
}

file_put_contents('出力したい場所', $result);