根本からひっくり返すようで恐縮ですが、正規表現である必要がありますか?
empty($str)
とか、 !strlen($str)
とか、 $str === ''
で比較したほうが、意図がわかりやすくて良いと思います。正規表現は他の人がコードを見たときや、自分自身であっても後になって見たときに、何にマッチさせようとしているのかを読み取るのが大変というデメリットがあります。
次のコードは正規表現 (preg_match()
) で比較した例と文字列一致 (in_array()
) で比較した例です。どちらも文字列とだけ比較する限りは、結果は同じです。
文字列以外 (false, null) が渡される可能性がある場合は、 preg_match()
では意図せずtrueになってしまう可能性があるので、別途 is_string()
等で弾くような処理が必要です
php
1<?php
2
3define('ALLOWED_PATTERN', '/\A(|aiueo|popopo|hoge)\z/');
4
5define('ALLOWED_STRINGS', [
6 '',
7 'aiueo',
8 'popopo',
9 'hoge'
10]);
11
12foreach(['foo', 'hoge', '', null, false, 0, 42] as $str) {
13 $test_preg_match = preg_match(ALLOWED_PATTERN, $str);
14 $test_in_array = in_array($str, ALLOWED_STRINGS, true);
15
16 echo '-----' . PHP_EOL . 'subject: ';
17 var_dump($str);
18 if($test_preg_match) echo " -> '{$str}' has matched with preg_match." . PHP_EOL;
19 if($test_in_array) echo " -> '{$str}' has matched with in_array." . PHP_EOL;
20}
21
22/*
23-----
24subject: string(3) "foo"
25-----
26subject: string(4) "hoge"
27 -> 'hoge' has matched with preg_match.
28 -> 'hoge' has matched with in_array.
29-----
30subject: string(0) ""
31 -> '' has matched with preg_match.
32 -> '' has matched with in_array.
33-----
34subject: NULL
35 -> '' has matched with preg_match.
36-----
37subject: bool(false)
38 -> '' has matched with preg_match.
39-----
40subject: int(0)
41-----
42subject: int(42)
43*/