source: branches/version-2_12-dev/data/class/SC_CheckError.php @ 21767

Revision 21767, 47.7 KB checked in by shutta, 10 years ago (diff)

#1296 SC_* のコンストラクタの拡張が無視される
コンストラクタ名を、PHP4の記法(クラス名と同名の関数名)から、PHP5以降で標準的なconstructに変更。

  • Property svn:eol-style set to LF
  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/x-httpd-php; charset=UTF-8
Line 
1<?php
2/*
3 * This file is part of EC-CUBE
4 *
5 * Copyright(c) 2000-2011 LOCKON CO.,LTD. All Rights Reserved.
6 *
7 * http://www.lockon.co.jp/
8 *
9 * This program is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU General Public License
11 * as published by the Free Software Foundation; either version 2
12 * of the License, or (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
22 */
23
24/*----------------------------------------------------------------------
25 * [名称] SC_CheckError
26 * [概要] エラーチェッククラス
27 *----------------------------------------------------------------------
28 */
29class SC_CheckError {
30    var $arrErr = array();
31    var $arrParam;
32
33    // チェック対象の値が含まれる配列をセットする。
34    function __construct($array = '') {
35        if ($array != '') {
36            $this->arrParam = $array;
37        } else {
38            $this->arrParam = $_POST;
39        }
40
41    }
42
43    function doFunc($value, $arrFunc) {
44        foreach ($arrFunc as $key) {
45            $this->$key($value);
46        }
47    }
48
49    /**
50     * HTMLのタグをチェックする
51     *
52     * @param array $value value[0] = 項目名 value[1] = 判定対象 value[2] = 許可するタグが格納された配列
53     * @return void
54     */
55    function HTML_TAG_CHECK($value) {
56        if (isset($this->arrErr[$value[1]])) {
57            return;
58        }
59        $this->createParam($value);
60        // HTMLに含まれているタグを抽出する
61        preg_match_all('/<\/?([a-z]+)/i', $this->arrParam[$value[1]], $arrTagIncludedHtml);
62
63        $arrDiffTag = array_diff($arrTagIncludedHtml[1], $value[2]);
64
65        if (empty($arrDiffTag)) return;
66
67        // 少々荒っぽいが、表示用 HTML に変換する
68        foreach ($arrDiffTag as &$tag) {
69            $tag = '[' . htmlspecialchars($tag) . ']';
70        }
71        $html_diff_tag_list = implode(', ', $arrDiffTag);
72
73        $this->arrErr[$value[1]] = '※ ' . $value[0] . 'に許可されていないタグ ' . $html_diff_tag_list . ' が含まれています。<br />';
74    }
75
76    /**
77     * 必須入力の判定
78     *
79     * 受け取りがない場合エラーを返す
80     * @param array $value value[0] = 項目名 value[1] = 判定対象
81     * @return void
82     */
83    function EXIST_CHECK($value) {
84        if (isset($this->arrErr[$value[1]])) {
85            return;
86        }
87        $this->createParam($value);
88        if (!is_array($this->arrParam[$value[1]]) && strlen($this->arrParam[$value[1]]) == 0) {
89            $this->arrErr[$value[1]] = '※ ' . $value[0] . 'が入力されていません。<br />';
90        } else if (is_array($this->arrParam[$value[1]]) && count($this->arrParam[$value[1]]) == 0) {
91            $this->arrErr[$value[1]] = '※ ' . $value[0] . 'が選択されていません。<br />';
92        }
93    }
94
95    /**
96     * 必須入力の判定(逆順)
97     *
98     * 受け取りがない場合エラーを返す
99     * @param array $value value[0] = 判定対象 value[1] = 項目名
100     * @return void
101     */
102    function EXIST_CHECK_REVERSE($value) {
103        if (isset($this->arrErr[$value[0]])) {
104            return;
105        }
106        $this->createParam($value);
107        if (strlen($this->arrParam[$value[0]]) == 0) {
108            $this->arrErr[$value[0]] = '※ ' . $value[0] . 'が入力されていません。<br />';
109        }
110    }
111
112    /**
113     * スペース、タブの判定
114     *
115     * 受け取りがない場合エラーを返す
116     * @param array $value value[0] = 項目名 value[1] = 判定対象
117     * @return void
118     */
119    function SPTAB_CHECK($value) {
120        if (isset($this->arrErr[$value[1]])) {
121            return;
122        }
123        $this->createParam($value);
124        if (strlen($this->arrParam[$value[1]]) != 0 && preg_match("/^[  \t\r\n]+$/", $this->arrParam[$value[1]])) {
125            $this->arrErr[$value[1]] = '※ ' . $value[0] . 'にスペース、タブ、改行のみの入力はできません。<br />';
126        }
127    }
128
129    /**
130     * スペース、タブの判定
131     *
132     * 受け取りがない場合エラーを返す
133     * @param array $value value[0] = 項目名 value[1] = 判定対象
134     * @return void
135     */
136    function NO_SPTAB($value) {
137        if (isset($this->arrErr[$value[1]])) {
138            return;
139        }
140        $this->createParam($value);
141        if (strlen($this->arrParam[$value[1]]) != 0 && preg_match("/[  \t\r\n]+/u", $this->arrParam[$value[1]])) {
142            $this->arrErr[$value[1]] = '※ ' . $value[0] . 'にスペース、タブ、改行は含めないで下さい。<br />';
143        }
144    }
145
146    /* ゼロで開始されている数値の判定 */
147    function ZERO_START($value) {
148        if (isset($this->arrErr[$value[1]])) {
149            return;
150        }
151        $this->createParam($value);
152        if (strlen($this->arrParam[$value[1]]) != 0 && preg_match("/^[0]+[0-9]+$/", $this->arrParam[$value[1]])) {
153            $this->arrErr[$value[1]] = '※ ' . $value[0] . 'に0で始まる数値が入力されています。<br />';
154        }
155    }
156
157    /**
158     * 必須選択の判定
159     *
160     * プルダウンなどで選択されていない場合エラーを返す
161     * @param array $value value[0] = 項目名 value[1] = 判定対象
162     * @return void
163     */
164    function SELECT_CHECK($value) {
165        if (isset($this->arrErr[$value[1]])) {
166            return;
167        }
168        $this->createParam($value);
169        if (strlen($this->arrParam[$value[1]]) == 0) {
170            $this->arrErr[$value[1]] = '※ ' . $value[0] . 'が選択されていません。<br />';
171        }
172    }
173
174    /**
175     * 同一性の判定
176     *
177     * 入力が指定文字数以上ならエラーを返す
178     * @param array $value value[0] = 項目名1 value[1] = 項目名2 value[2] = 判定対象文字列1  value[3] = 判定対象文字列2
179     * @return void
180     */
181    function EQUAL_CHECK($value) {
182        if (isset($this->arrErr[$value[2]]) || isset($this->arrErr[$value[3]])) {
183            return;
184        }
185        $this->createParam($value);
186        // 文字数の取得
187        if ($this->arrParam[$value[2]] !== $this->arrParam[$value[3]]) {
188            $this->arrErr[$value[2]] = '※ ' . $value[0] . 'と' . $value[1] . 'が一致しません。<br />';
189        }
190    }
191
192    /**
193     * 値が異なることの判定
194     *
195     * 入力が指定文字数以上ならエラーを返す
196     * @param array $value value[0] = 項目名1 value[1] = 項目名2 value[2] = 判定対象文字列1  value[3] = 判定対象文字列2
197     * @return void
198     */
199    function DIFFERENT_CHECK($value) {
200        if (isset($this->arrErr[$value[2]]) || isset($this->arrErr[$value[3]])) {
201            return;
202        }
203        $this->createParam($value);
204        // 文字数の取得
205        if ($this->arrParam[$value[2]] == $this->arrParam[$value[3]]) {
206            $this->arrErr[$value[2]] = '※ ' . $value[0] . 'と' . $value[1] . 'は、同じ値を使用できません。<br />';
207        }
208    }
209
210    /**
211     * 値の大きさを比較する value[2] < value[3]でなければエラー
212     *
213     * 入力が指定文字数以上ならエラーを返す
214     * @param array $value value[0] = 項目名1 value[1] = 項目名2 value[2] = 判定対象文字列1  value[3] = 判定対象文字列2
215     * @return void
216     */
217    function GREATER_CHECK($value) {
218        if (isset($this->arrErr[$value[2]]) || isset($this->arrErr[$value[3]])) {
219            return;
220        }
221        $this->createParam($value);
222        // 文字数の取得
223        if ($this->arrParam[$value[2]] != '' && $this->arrParam[$value[3]] != '' && ($this->arrParam[$value[2]] > $this->arrParam[$value[3]])) {
224            $this->arrErr[$value[2]] = '※ ' . $value[0] . 'は' . $value[1] . 'より大きい値を入力できません。<br />';
225        }
226    }
227
228    /**
229     * 最大文字数制限の判定
230     *
231     * 入力が指定文字数以上ならエラーを返す
232     * @param array $value value[0] = 項目名 value[1] = 判定対象文字列  value[2] = 最大文字数(半角も全角も1文字として数える)
233     * @return void
234     */
235    function MAX_LENGTH_CHECK($value) {
236        if (isset($this->arrErr[$value[1]])) {
237            return;
238        }
239        $this->createParam($value);
240        // 文字数の取得
241        if (mb_strlen($this->arrParam[$value[1]]) > $value[2]) {
242            $this->arrErr[$value[1]] = '※ ' . $value[0] . 'は' . $value[2] . '字以下で入力してください。<br />';
243        }
244    }
245
246    /**
247     * 最小文字数制限の判定
248     *
249     * 入力が指定文字数未満ならエラーを返す
250     * @param array $value value[0] = 項目名 value[1] = 判定対象文字列 value[2] = 最小文字数(半角も全角も1文字として数える)
251     * @return void
252     */
253    function MIN_LENGTH_CHECK($value) {
254        if (isset($this->arrErr[$value[1]])) {
255            return;
256        }
257        $this->createParam($value);
258        // 文字数の取得
259        if (mb_strlen($this->arrParam[$value[1]]) < $value[2]) {
260            $this->arrErr[$value[1]] = '※ ' . $value[0] . 'は' . $value[2] . '字以上で入力してください。<br />';
261        }
262    }
263
264    /**
265     * 最大文字数制限の判定
266     *
267     * 入力が最大数以上ならエラーを返す
268     * @param array $value value[0] = 項目名 value[1] = 判定対象文字列  value[2] = 最大数]
269     * @return void
270     */
271    function MAX_CHECK($value) {
272        if (isset($this->arrErr[$value[1]])) {
273            return;
274        }
275        $this->createParam($value);
276        // 文字数の取得
277        if ($this->arrParam[$value[1]] > $value[2]) {
278            $this->arrErr[$value[1]] = '※ ' . $value[0] . 'は' . $value[2] . '以下で入力してください。<br />';
279        }
280    }
281
282    /**
283     * 最小数値制限の判定
284     *
285     * 入力が最小数未満ならエラーを返す
286     * @param array $value value[0] = 項目名 value[1] = 判定対象文字列  value[2] = 最小数
287     * @return void
288     */
289    function MIN_CHECK($value) {
290        if (isset($this->arrErr[$value[1]])) {
291            return;
292        }
293        $this->createParam($value);
294        if ($this->arrParam[$value[1]] < $value[2]) {
295            $this->arrErr[$value[1]] = '※ ' . $value[0] . 'は' . $value[2] . '以上で入力してください。<br />';
296        }
297    }
298
299    /**
300     * 数字の判定
301     *
302     * 入力文字が数字以外ならエラーを返す
303     * @param array $value value[0] = 項目名 value[1] = 判定対象文字列
304     * @return void
305     */
306    function NUM_CHECK($value) {
307        if (isset($this->arrErr[$value[1]])) {
308            return;
309        }
310        $this->createParam($value);
311        if ($this->numelicCheck($this->arrParam[$value[1]])) {
312            $this->arrErr[$value[1]] = '※ ' . $value[0] . 'は数字で入力してください。<br />';
313        }
314    }
315
316    /**
317     * 小数点を含む数字の判定
318     *
319     * 入力文字が数字以外ならエラーを返す
320     * @param array $value value[0] = 項目名 value[1] = 判定対象文字列
321     * @return void
322     */
323    function NUM_POINT_CHECK($value) {
324        if (isset($this->arrErr[$value[1]])) {
325            return;
326        }
327        $this->createParam($value);
328        if (strlen($this->arrParam[$value[1]]) > 0 && !is_numeric($this->arrParam[$value[1]])) {
329            $this->arrErr[$value[1]] = '※ ' . $value[0] . 'は数字で入力してください。<br />';
330        }
331    }
332
333    function ALPHA_CHECK($value) {
334        if (isset($this->arrErr[$value[1]])) {
335            return;
336        }
337        $this->createParam($value);
338        if (strlen($this->arrParam[$value[1]]) > 0 && !ctype_alpha($this->arrParam[$value[1]])) {
339            $this->arrErr[$value[1]] = '※ ' . $value[0] . 'は半角英字で入力してください。<br />';
340        }
341    }
342
343    /**
344     * 電話番号の判定
345     *
346     * 数字チェックと文字数チェックを実施する。
347     * @param array $value 各要素は以下の通り。<br>
348     *     [0]: 項目名<br>
349     *     [1]: 電番1項目目<br>
350     *     [2]: 電番2項目目<br>
351     *     [3]: 電番3項目目<br>
352     *     [4]: 電話番号各項目制限 (指定なしの場合、TEL_ITEM_LEN)<br>
353     *     [5]: 電話番号総数 (指定なしの場合、TEL_LEN)
354     * @return void
355     */
356    function TEL_CHECK($value) {
357        $telItemLen = isset($value[4]) ? $value[4] : TEL_ITEM_LEN;
358        $telLen = isset($value[5]) ? $value[5] : TEL_LEN;
359
360        if (isset($this->arrErr[$value[1]]) || isset($this->arrErr[$value[2]]) || isset($this->arrErr[$value[3]])) {
361            return;
362        }
363        $this->createParam($value);
364        $cnt = 0;
365
366        for ($i = 1; $i <= 3; $i++) {
367            if (strlen($this->arrParam[$value[$i]]) > 0) {
368                $cnt++;
369            }
370        }
371
372        // すべての項目が満たされていない場合を判定(一部だけ入力されている状態)
373        if ($cnt > 0 && $cnt < 3) {
374            $this->arrErr[$value[1]] .= '※ ' . $value[0] . 'はすべての項目を入力してください。<br />';
375        }
376
377        $total_count = 0;
378        for ($i = 1; $i <= 3; $i++) {
379            if (strlen($this->arrParam[$value[$i]]) > 0 && strlen($this->arrParam[$value[$i]]) > $telItemLen) {
380                $this->arrErr[$value[$i]] .= '※ ' . $value[0] . $i . 'は' . $telItemLen . '字以内で入力してください。<br />';
381            } else if ($this->numelicCheck($this->arrParam[$value[1]])) {
382                $this->arrErr[$value[$i]] .= '※ ' . $value[0] . $i . 'は数字で入力してください。<br />';
383            }
384            $total_count += strlen($this->arrParam[$value[$i]]);
385        }
386
387        // 合計値チェック
388        if ($total_count > $telLen) {
389            $this->arrErr[$value[3]] .= '※ ' . $value[0] . 'は' . $telLen . '文字以内で入力してください。<br />';
390        }
391    }
392
393    /* 関連項目が完全に満たされているか判定
394        value[0]    : 項目名
395        value[1]    : 判定対象要素名
396    */
397    function FULL_EXIST_CHECK($value) {
398        $max = count($value);
399        $this->createParam($value);
400        // 既に該当項目にエラーがある場合は、判定しない。
401        for ($i = 1; $i < $max; $i++) {
402            if (isset($this->arrErr[$value[$i]])) {
403                return;
404            }
405        }
406
407        $blank = false;
408
409        // すべての項目がブランクでないか、すべての項目が入力されていない場合はエラーとする。
410        for ($i = 1; $i < $max; $i++) {
411            if (strlen($this->arrParam[$value[$i]]) <= 0) {
412                $blank = true;
413            }
414        }
415
416        if ($blank) {
417            $this->arrErr[$value[1]] = '※ ' . $value[0] . 'が入力されていません。<br />';
418        }
419    }
420
421    /* 関連項目がすべて満たされているか判定
422        value[0]    : 項目名
423        value[1]    : 判定対象要素名
424    */
425    function ALL_EXIST_CHECK($value) {
426        $max = count($value);
427
428        // 既に該当項目にエラーがある場合は、判定しない。
429        for ($i = 1; $i < $max; $i++) {
430            if (isset($this->arrErr[$value[$i]])) {
431                return;
432            }
433        }
434
435        $blank = false;
436        $input = false;
437
438        // すべての項目がブランクでないか、すべての項目が入力されていない場合はエラーとする。
439        for ($i = 1; $i < $max; $i++) {
440            if (strlen($this->arrParam[$value[$i]]) <= 0) {
441                $blank = true;
442            } else {
443                $input = true;
444            }
445        }
446
447        if ($blank && $input) {
448            $this->arrErr[$value[1]] = '※ ' . $value[0] . 'はすべての項目を入力して下さい。<br />';
449        }
450    }
451
452    /* 関連項目がどれか一つ満たされているか判定
453        value[0]    : 項目名
454        value[1]    : 判定対象要素名
455    */
456    function ONE_EXIST_CHECK($value) {
457        $max = count($value);
458        $this->createParam($value);
459        // 既に該当項目にエラーがある場合は、判定しない。
460        for ($i = 1; $i < $max; $i++) {
461            if (isset($this->arrErr[$value[$i]])) {
462                return;
463            }
464        }
465
466        $input = false;
467
468        // すべての項目がブランクでないか、すべての項目が入力されていない場合はエラーとする。
469        for ($i = 1; $i < $max; $i++) {
470            if (strlen($this->arrParam[$value[$i]]) > 0) {
471                $input = true;
472            }
473        }
474
475        if (!$input) {
476            $this->arrErr[$value[1]] = '※ ' . $value[0] . 'が入力されていません。<br />';
477        }
478    }
479
480    /* 上位の項目が満たされているか判定
481        value[0]    : 項目名
482        value[1]    : 判定対象要素名
483    */
484    function TOP_EXIST_CHECK($value) {
485        $max = count($value);
486        $this->createParam($value);
487
488        // 既に該当項目にエラーがある場合は、判定しない。
489        for ($i = 1; $i < $max; $i++) {
490            if (isset($this->arrErr[$value[$i]])) {
491                return;
492            }
493        }
494
495        $blank = false;
496        $error = false;
497
498        // すべての項目がブランクでないか、すべての項目が入力されていない場合はエラーとする。
499        for ($i = 1; $i < $max; $i++) {
500            if (strlen($this->arrParam[$value[$i]]) <= 0) {
501                $blank = true;
502            } else {
503                if ($blank) {
504                    $error = true;
505                }
506            }
507        }
508
509        if ($error) {
510            $this->arrErr[$value[1]] = '※ ' . $value[0] . 'は先頭の項目から順番に入力して下さい。<br />';
511        }
512    }
513
514    /* カタカナの判定 */
515    // 入力文字がカナ以外ならエラーを返す
516    // value[0] = 項目名 value[1] = 判定対象文字列
517    function KANA_CHECK($value) {
518        if (isset($this->arrErr[$value[1]])) {
519            return;
520        }
521        $this->createParam($value);
522        if (strlen($this->arrParam[$value[1]]) > 0 && !preg_match("/^[ァ-ヶヲ-゚ー]+$/u", $this->arrParam[$value[1]])) {
523            $this->arrErr[$value[1]] = '※ ' . $value[0] . 'はカタカナで入力してください。<br />';
524        }
525    }
526
527    /* カタカナの判定2 (タブ、スペースは許可する) */
528    // 入力文字がカナ以外ならエラーを返す
529    // value[0] = 項目名 value[1] = 判定対象文字列
530    function KANABLANK_CHECK($value) {
531        if (isset($this->arrErr[$value[1]])) {
532            return;
533        }
534        $this->createParam($value);
535        if (strlen($this->arrParam[$value[1]]) > 0 && !preg_match("/^([  \t\r\n]|[ァ-ヶ]|[ー])+$/u", $this->arrParam[$value[1]])) {
536            $this->arrErr[$value[1]] = '※ ' . $value[0] . 'はカタカナで入力してください。<br />';
537        }
538    }
539
540    /* 英数字の判定 */
541    // 入力文字が英数字以外ならエラーを返す
542    // value[0] = 項目名 value[1] = 判定対象文字列
543    function ALNUM_CHECK($value) {
544        if (isset($this->arrErr[$value[1]])) {
545            return;
546        }
547        $this->createParam($value);
548        if (strlen($this->arrParam[$value[1]]) > 0 && !ctype_alnum($this->arrParam[$value[1]])) {
549            $this->arrErr[$value[1]] = '※ ' . $value[0] . 'は英数字で入力してください。<br />';
550        }
551    }
552
553    /* 英数記号の判定 */
554    // 入力文字が英数記号以外ならエラーを返す
555    // value[0] = 項目名 value[1] = 判定対象文字列
556    function GRAPH_CHECK($value) {
557        if (isset($this->arrErr[$value[1]])) {
558            return;
559        }
560        $this->createParam($value);
561        if (strlen($this->arrParam[$value[1]]) > 0 && !preg_match("/^[[:graph:]|[:space:]]+$/i", $this->arrParam[$value[1]])) {
562            $this->arrErr[$value[1]] = '※ ' . $value[0] . 'は英数記号で入力してください。<br />';
563        }
564    }
565
566    /* 必須選択の判定 */
567    // 入力値で0が許されない場合エラーを返す
568    // value[0] = 項目名 value[1] = 判定対象
569    function ZERO_CHECK($value) {
570        $this->createParam($value);
571        if ($this->arrParam[$value[1]] == '0') {
572            $this->arrErr[$value[1]] = '※ ' . $value[0] . 'は1以上を入力してください。<br />';
573        }
574    }
575
576    /* 桁数の判定 (最小最大)*/
577    // 入力文字の桁数判定 → 最小桁数<入力文字列<最大桁数
578    // value[0] = 項目名 value[1] = 判定対象文字列 value[2] = 最小桁数 value[3] = 最大桁数
579    function NUM_RANGE_CHECK($value) {
580        if (isset($this->arrErr[$value[1]])) {
581            return;
582        }
583        $this->createParam($value);
584        // $this->arrParam[$value[0]] = mb_convert_kana($this->arrParam[$value[0]], 'n');
585        $count = strlen($this->arrParam[$value[1]]);
586        if (($count > 0) && $value[2] > $count || $value[3] < $count) {
587            $this->arrErr[$value[1]] =  "※ $value[0]は$value[2]桁~$value[3]桁で入力して下さい。<br />";
588        }
589    }
590
591    /* 桁数の判定 */
592    // 入力文字の桁数判定 → 入力文字列 = 桁数 以外はNGの場合
593    // value[0] = 項目名 value[1] = 判定対象文字列 value[2] = 桁数
594    function NUM_COUNT_CHECK($value) {
595        if (isset($this->arrErr[$value[1]])) {
596            return;
597        }
598        $this->createParam($value);
599        $count = strlen($this->arrParam[$value[1]]);
600        if (($count > 0) && $count != $value[2]) {
601            $this->arrErr[$value[1]] =  "※ $value[0]は$value[2]桁で入力して下さい。<br />";
602        }
603    }
604
605    /**
606     * メールアドレス形式の判定
607     *
608     * @param array $value 各要素は以下の通り。<br>
609     *     [0]: 項目名<br>
610     *     [1]: 判定対象を格納している配列キー
611     * @return void
612     */
613    function EMAIL_CHECK($value) {
614        if (isset($this->arrErr[$value[1]])) {
615            return;
616        }
617
618        $this->createParam($value);
619
620        // 入力がない場合処理しない
621        if (strlen($this->arrParam[$value[1]]) === 0) {
622            return;
623        }
624
625        $wsp           = '[\x20\x09]';
626        $vchar         = '[\x21-\x7e]';
627        $quoted_pair   = "\\\\(?:$vchar|$wsp)";
628        $qtext         = '[\x21\x23-\x5b\x5d-\x7e]';
629        $qcontent      = "(?:$qtext|$quoted_pair)";
630        $quoted_string = "\"$qcontent*\"";
631        $atext         = '[a-zA-Z0-9!#$%&\'*+\-\/\=?^_`{|}~]';
632        $dot_atom_text = "$atext+(?:[.]$atext+)*";
633        $dot_atom      = $dot_atom_text;
634        $local_part    = "(?:$dot_atom|$quoted_string)";
635        $domain        = $dot_atom;
636        $addr_spec     = "${local_part}[@]$domain";
637
638        $dot_atom_loose   = "$atext+(?:[.]|$atext)*";
639        $local_part_loose = "(?:$dot_atom_loose|$quoted_string)";
640        $addr_spec_loose  = "${local_part_loose}[@]$domain";
641
642        if (RFC_COMPLIANT_EMAIL_CHECK) {
643            $regexp = "/\A${addr_spec}\z/";
644        } else {
645            // 携帯メールアドレス用に、..や.@を許容する。
646            $regexp = "/\A${addr_spec_loose}\z/";
647        }
648
649        if (!preg_match($regexp, $this->arrParam[$value[1]])) {
650            $this->arrErr[$value[1]] = '※ ' . $value[0] . 'の形式が不正です。<br />';
651            return;
652        }
653
654        // 最大文字数制限の判定 (#871)
655        $arrValueTemp = $value;
656        $arrValueTemp[2] = 256;
657        $this->MAX_LENGTH_CHECK($arrValueTemp);
658    }
659
660    /* メールアドレスに使用できる文字の判定 */
661    // メールアドレスに使用する文字を正規表現で判定する
662    //  value[0] = 項目名 value[1] = 判定対象メールアドレス
663    function EMAIL_CHAR_CHECK($value) {
664        if (isset($this->arrErr[$value[1]])) {
665            return;
666        }
667        $this->createParam($value);
668        if (strlen($this->arrParam[$value[1]]) > 0 && !preg_match("/^[a-zA-Z0-9_\.@\+\?-]+$/i",$this->arrParam[$value[1]])) {
669            $this->arrErr[$value[1]] = '※ ' . $value[0] . 'に使用する文字を正しく入力してください。<br />';
670        }
671    }
672
673    /* URL形式の判定 */
674    // URLを正規表現で判定する。デフォルトでhttp://があってもOK
675    //  value[0] = 項目名 value[1] = 判定対象URL
676    function URL_CHECK($value) {
677        if (isset($this->arrErr[$value[1]])) {
678            return;
679        }
680        if (strlen($this->arrParam[$value[1]]) > 0 && !preg_match("@^https?://+($|[a-zA-Z0-9_~=:&\?\.\/-])+$@i", $this->arrParam[$value[1]])) {
681            $this->arrErr[$value[1]] = '※ ' . $value[0] . 'を正しく入力してください。<br />';
682        }
683    }
684
685    /* IPアドレスの判定 */
686    //  value[0] = 項目名 value[1] = 判定対象IPアドレス文字列
687    function IP_CHECK($value) {
688        if (isset($this->arrErr[$value[1]])) {
689            return;
690        }
691        //改行コードが含まれている場合には配列に変換
692        $params = str_replace("\r",'',$this->arrParam[$value[1]]);
693        if (!empty($params)) {
694            if (strpos($params,"\n") === false) {
695                $params .= "\n";
696            }
697            $params = explode("\n",$params);
698            foreach ($params as $param) {
699                $param = trim($param);
700                if (long2ip(ip2long($param)) != trim($param) && !empty($param)) {
701                    $this->arrErr[$value[1]] = '※ ' . $value[0] . 'に正しい形式のIPアドレスを入力してください。<br />';
702                }
703            }
704        }
705    }
706
707    /* 拡張子の判定 */
708    // 受け取りがない場合エラーを返す
709    // value[0] = 項目名 value[1] = 判定対象 value[2]=array(拡張子)
710    function FILE_EXT_CHECK($value) {
711        if (isset($this->arrErr[$value[1]]) || count($value[2]) == 0) {
712            return;
713        }
714        $this->createParam($value);
715
716        $match = false;
717        if (strlen($_FILES[$value[1]]['name']) >= 1) {
718            $filename = $_FILES[$value[1]]['name'];
719
720            foreach ($value[2] as $check_ext) {
721                $match = preg_match('/' . preg_quote('.' . $check_ext) . '$/i', $filename) >= 1;
722                if ($match === true) {
723                    break 1;
724                }
725            }
726        }
727        if ($match === false) {
728            $str_ext = implode('・', $value[2]);
729            $this->arrErr[$value[1]] = '※ ' . $value[0] . 'で許可されている形式は、' . $str_ext . 'です。<br />';
730        }
731    }
732
733    /* ファイルが存在するかチェックする */
734    // 受け取りがない場合エラーを返す
735    // value[0] = 項目名 value[1] = 判定対象  value[2] = 指定ディレクトリ
736    function FIND_FILE($value) {
737        if (isset($this->arrErr[$value[1]])) {
738            return;
739        }
740
741        $this->createParam($value);
742        if ($value[2] != '') {
743            $dir = $value[2];
744        } else {
745            $dir = IMAGE_SAVE_REALDIR;
746        }
747
748        $path = $dir . '/' . $this->arrParam[$value[1]];
749        $path = str_replace('//', '/', $path);
750
751        if ($this->arrParam[$value[1]] != '' && !file_exists($path)) {
752            $this->arrErr[$value[1]] = '※ ' . $path . 'が見つかりません。<br />';
753        }
754    }
755
756    /* ファイルが上げられたか確認 */
757    // 受け取りがない場合エラーを返す
758    // value[0] = 項目名 value[1] = 判定対象  value[2] = 指定サイズ(KB)
759    function FILE_EXIST_CHECK($value) {
760        if (isset($this->arrErr[$value[1]])) {
761            return;
762        }
763        $this->createParam($value);
764        if (!($_FILES[$value[1]]['size'] != '' && $_FILES[$value[1]]['size'] > 0)) {
765            $this->arrErr[$value[1]] = '※ ' . $value[0] . 'をアップロードして下さい。<br />';
766        }
767    }
768
769    /* ファイルサイズの判定 */
770    // 受け取りがない場合エラーを返す
771    // value[0] = 項目名 value[1] = 判定対象  value[2] = 指定サイズ(KB)
772    function FILE_SIZE_CHECK($value) {
773        if (isset($this->arrErr[$value[1]])) {
774            return;
775        }
776        $this->createParam($value);
777        if ($_FILES[$value[1]]['size'] > $value[2] *  1024) {
778            $byte = 'KB';
779            if ($value[2] >= 1000) {
780                $value[2] = $value[2] / 1000;
781                $byte = 'MB';
782            }
783            $this->arrErr[$value[1]] = '※ ' . $value[0] . 'のファイルサイズは' . $value[2] . $byte . '以下のものを使用してください。<br />';
784        }
785    }
786
787    /* ファイル名の判定 */
788    // 入力文字が英数字,'_','-'以外ならエラーを返す
789    // value[0] = 項目名 value[1] = 判定対象文字列
790    function FILE_NAME_CHECK($value) {
791        if (isset($this->arrErr[$value[1]])) {
792            return;
793        }
794        $this->createParam($value);
795        if (strlen($_FILES[$value[1]]['name']) > 0 && !preg_match("/^[[:alnum:]_\.-]+$/i", $_FILES[$value[1]]['name'])) {
796            $this->arrErr[$value[1]] = '※ ' . $value[0] . 'のファイル名に日本語やスペースは使用しないで下さい。<br />';
797        }
798    }
799
800    /* ファイル名の判定(アップロード以外の時) */
801    // 入力文字が英数字,'_','-'以外ならエラーを返す
802    // value[0] = 項目名 value[1] = 判定対象文字列
803    function FILE_NAME_CHECK_BY_NOUPLOAD($value) {
804        if (isset($this->arrErr[$value[1]])) {
805            return;
806        }
807        $this->createParam($value);
808        if (strlen($this->arrParam[$value[1]]) > 0 && !preg_match("/^[[:alnum:]_\.-]+$/i", $this->arrParam[$value[1]]) || preg_match('/[\\]/' ,$this->arrParam[$value[1]])) {
809            $this->arrErr[$value[1]] = '※ ' . $value[0] . 'のファイル名に日本語やスペースは使用しないで下さい。<br />';
810        }
811    }
812
813    //日付チェック
814    // value[0] = 項目名
815    // value[1] = YYYY
816    // value[2] = MM
817    // value[3] = DD
818    function CHECK_DATE($value) {
819        if (isset($this->arrErr[$value[1]])) {
820            return;
821        }
822        $this->createParam($value);
823        // 少なくともどれか一つが入力されている。
824        if ($this->arrParam[$value[1]] > 0 || $this->arrParam[$value[2]] > 0 || $this->arrParam[$value[3]] > 0) {
825            // 年月日のどれかが入力されていない。
826            if (!(strlen($this->arrParam[$value[1]]) > 0 && strlen($this->arrParam[$value[2]]) > 0 && strlen($this->arrParam[$value[3]]) > 0)) {
827                $this->arrErr[$value[1]] = '※ ' . $value[0] . 'はすべての項目を入力して下さい。<br />';
828            } else if (! checkdate($this->arrParam[$value[2]], $this->arrParam[$value[3]], $this->arrParam[$value[1]])) {
829                $this->arrErr[$value[1]] = '※ ' . $value[0] . 'が正しくありません。<br />';
830            }
831        }
832    }
833
834    //日付チェック
835    // value[0] = 項目名
836    // value[1] = YYYY
837    // value[2] = MM
838    // value[3] = DD
839    // value[4] = HH
840    // value[5] = mm
841    function CHECK_DATE2($value) {
842        if (isset($this->arrErr[$value[1]])) {
843            return;
844        }
845        $this->createParam($value);
846        // 少なくともどれか一つが入力されている。
847        if ($this->arrParam[$value[1]] > 0 || $this->arrParam[$value[2]] > 0 || $this->arrParam[$value[3]] > 0 || $this->arrParam[$value[4]] >= 0 || $this->arrParam[$value[5]] >= 0) {
848            // 年月日時のどれかが入力されていない。
849            if (!(strlen($this->arrParam[$value[1]]) > 0 && strlen($this->arrParam[$value[2]]) > 0 && strlen($this->arrParam[$value[3]]) > 0 && strlen($this->arrParam[$value[4]]) > 0 && strlen($this->arrParam[$value[5]]) > 0)) {
850                $this->arrErr[$value[1]] = '※ ' . $value[0] . 'はすべての項目を入力して下さい。<br />';
851            } else if (! checkdate($this->arrParam[$value[2]], $this->arrParam[$value[3]], $this->arrParam[$value[1]])) {
852                $this->arrErr[$value[1]] = '※ ' . $value[0] . 'が正しくありません。<br />';
853            }
854        }
855    }
856
857    //日付チェック
858    // value[0] = 項目名
859    // value[1] = YYYY
860    // value[2] = MM
861    function CHECK_DATE3($value) {
862        if (isset($this->arrErr[$value[1]])) {
863            return;
864        }
865        $this->createParam($value);
866        // 少なくともどれか一つが入力されている。
867        if ($this->arrParam[$value[1]] > 0 || $this->arrParam[$value[2]] > 0) {
868            // 年月日時のどれかが入力されていない。
869            if (!(strlen($this->arrParam[$value[1]]) > 0 && strlen($this->arrParam[$value[2]]) > 0)) {
870                $this->arrErr[$value[1]] = '※ ' . $value[0] . 'はすべての項目を入力して下さい。<br />';
871            } else if (! checkdate($this->arrParam[$value[2]], 1, $this->arrParam[$value[1]])) {
872                $this->arrErr[$value[1]] = '※ ' . $value[0] . 'が正しくありません。<br />';
873            }
874        }
875    }
876
877    //誕生日チェック
878    // value[0] = 項目名
879    // value[1] = YYYY
880    // value[2] = MM
881    // value[3] = DD
882    function CHECK_BIRTHDAY($value) {
883        if (isset($this->arrErr[$value[1]])) {
884            return;
885        }
886
887        $this->createParam($value);
888        // 年が入力されている。
889        if ($this->arrParam[$value[1]] > 0) {
890
891            // 年の数字チェック、最小数値制限チェック
892            $this->doFunc(array($value[0].'(年)', $value[1], BIRTH_YEAR), array('NUM_CHECK', 'MIN_CHECK'));
893            // 上のチェックでエラーある場合、中断する。
894            if (isset($this->arrErr[$value[1]])) {
895                return;
896            }
897
898            // 年の最大数値制限チェック
899            $this->doFunc(array($value[0].'(年)', $value[1], date('Y',strtotime('now'))), array('MAX_CHECK'));
900            // 上のチェックでエラーある場合、中断する。
901            if (isset($this->arrErr[$value[1]])) {
902                return;
903            }
904        }
905
906        // XXX createParam() が二重に呼ばれる問題を抱える
907        $this->CHECK_DATE($value);
908    }
909
910    /*-----------------------------------------------------------------*/
911    /*  CHECK_SET_TERM
912    /*  年月日に別れた2つの期間の妥当性をチェックし、整合性と期間を返す
913    /*  引数 (開始年,開始月,開始日,終了年,終了月,終了日)
914    /*  戻値 array(1,2,3)
915    /*          1.開始年月日 (YYYYMMDD 000000)
916    /*          2.終了年月日 (YYYYMMDD 235959)
917    /*          3.エラー (0 = OK, 1 = NG)
918    /*-----------------------------------------------------------------*/
919    // value[0] = 項目名1
920    // value[1] = 項目名2
921    // value[2] = start_year
922    // value[3] = start_month
923    // value[4] = start_day
924    // value[5] = end_year
925    // value[6] = end_month
926    // value[7] = end_day
927    function CHECK_SET_TERM($value) {
928
929        // 期間指定
930        if (isset($this->arrErr[$value[2]]) || isset($this->arrErr[$value[5]])) {
931            return;
932        }
933        $this->createParam($value);
934        $error = 0;
935        if ((strlen($this->arrParam[$value[2]]) > 0 || strlen($this->arrParam[$value[3]]) > 0 || strlen($this->arrParam[$value[4]]) > 0) && ! checkdate($this->arrParam[$value[3]], $this->arrParam[$value[4]], $this->arrParam[$value[2]])) {
936            $this->arrErr[$value[2]] = '※ ' . $value[0] . 'を正しく指定してください。<br />';
937        }
938        if ((strlen($this->arrParam[$value[5]]) > 0 || strlen($this->arrParam[$value[6]]) > 0 || strlen($this->arrParam[$value[7]]) > 0) && ! checkdate($this->arrParam[$value[6]], $this->arrParam[$value[7]], $this->arrParam[$value[5]])) {
939            $this->arrErr[$value[5]] = '※ ' . $value[1] . 'を正しく指定してください。<br />';
940        }
941        if ((strlen($this->arrParam[$value[2]]) > 0 && strlen($this->arrParam[$value[3]]) > 0 && strlen($this->arrParam[$value[4]]) > 0) &&  (strlen($this->arrParam[$value[5]]) > 0 || strlen($this->arrParam[$value[6]]) > 0 || strlen($this->arrParam[$value[7]]) > 0)) {
942
943            $date1 = $this->arrParam[$value[2]] .sprintf('%02d', $this->arrParam[$value[3]]) .sprintf('%02d',$this->arrParam[$value[4]]) .'000000';
944            $date2 = $this->arrParam[$value[5]] .sprintf('%02d', $this->arrParam[$value[6]]) .sprintf('%02d',$this->arrParam[$value[7]]) .'235959';
945
946            if (($this->arrErr[$value[2]] == '' && $this->arrErr[$value[5]] == '') && $date1 > $date2) {
947                $this->arrErr[$value[2]] = '※ ' .$value[0]. 'と' .$value[1]. 'の期間指定が不正です。<br />';
948            }
949        }
950    }
951
952    /*-----------------------------------------------------------------*/
953    /*  CHECK_SET_TERM2
954    /*  年月日時に別れた2つの期間の妥当性をチェックし、整合性と期間を返す
955    /*  引数 (開始年,開始月,開始日,開始時間,開始分,開始秒,
956    /*        終了年,終了月,終了日,終了時間,終了分,終了秒)
957    /*  戻値 array(1,2,3)
958    /*          1.開始年月日 (YYYYMMDDHHmmss)
959    /*          2.終了年月日 (YYYYMMDDHHmmss)
960    /*          3.エラー (0 = OK, 1 = NG)
961    /*-----------------------------------------------------------------*/
962    // value[0] = 項目名1
963    // value[1] = 項目名2
964    // value[2] = start_year
965    // value[3] = start_month
966    // value[4] = start_day
967    // value[5] = start_hour
968    // value[6] = start_minute
969    // value[7] = start_second
970    // value[8] = end_year
971    // value[9] = end_month
972    // value[10] = end_day
973    // value[11] = end_hour
974    // value[12] = end_minute
975    // value[13] = end_second
976
977    /*-----------------------------------------------------------------*/
978    function CHECK_SET_TERM2($value) {
979
980        // 期間指定
981        if (isset($this->arrErr[$value[2]]) || isset($this->arrErr[$value[8]])) {
982            return;
983        }
984        $this->createParam($value);
985        $error = 0;
986        if ((strlen($this->arrParam[$value[2]]) > 0 || strlen($this->arrParam[$value[3]]) > 0 || strlen($this->arrParam[$value[4]]) > 0 || strlen($this->arrParam[$value[5]]) > 0) && ! checkdate($this->arrParam[$value[3]], $this->arrParam[$value[4]], $this->arrParam[$value[2]])) {
987            $this->arrErr[$value[2]] = '※ ' . $value[0] . 'を正しく指定してください。<br />';
988        }
989        if ((strlen($this->arrParam[$value[8]]) > 0 || strlen($this->arrParam[$value[9]]) > 0 || strlen($this->arrParam[$value[10]]) > 0 || strlen($this->arrParam[$value[11]]) > 0) && ! checkdate($this->arrParam[$value[9]], $this->arrParam[$value[10]], $this->arrParam[$value[8]])) {
990            $this->arrErr[$value[8]] = '※ ' . $value[1] . 'を正しく指定してください。<br />';
991        }
992        if ((strlen($this->arrParam[$value[2]]) > 0 && strlen($this->arrParam[$value[3]]) > 0 && strlen($this->arrParam[$value[4]]) > 0 && strlen($this->arrParam[$value[5]]) > 0) &&  (strlen($this->arrParam[$value[8]]) > 0 || strlen($this->arrParam[$value[9]]) > 0 || strlen($this->arrParam[$value[10]]) > 0 || strlen($this->arrParam[$value[11]]) > 0)) {
993
994            $date1 = $this->arrParam[$value[2]] .sprintf('%02d', $this->arrParam[$value[3]]) .sprintf('%02d',$this->arrParam[$value[4]]) .sprintf('%02d',$this->arrParam[$value[5]]).sprintf('%02d',$this->arrParam[$value[6]]).sprintf('%02d',$this->arrParam[$value[7]]);
995            $date2 = $this->arrParam[$value[8]] .sprintf('%02d', $this->arrParam[$value[9]]) .sprintf('%02d',$this->arrParam[$value[10]]) .sprintf('%02d',$this->arrParam[$value[11]]).sprintf('%02d',$this->arrParam[$value[12]]).sprintf('%02d',$this->arrParam[$value[13]]);
996
997            if (($this->arrErr[$value[2]] == '' && $this->arrErr[$value[8]] == '') && $date1 > $date2) {
998                $this->arrErr[$value[2]] = '※ ' .$value[0]. 'と' .$value[1]. 'の期間指定が不正です。<br />';
999            }
1000            if ($date1 == $date2) {
1001                $this->arrErr[$value[2]] = '※ ' .$value[0]. 'と' .$value[1]. 'の期間指定が不正です。<br />';
1002            }
1003
1004        }
1005    }
1006
1007    /*-----------------------------------------------------------------*/
1008    /*  CHECK_SET_TERM3
1009    /*  年月に別れた2つの期間の妥当性をチェックし、整合性と期間を返す
1010    /* 引数 (開始年,開始月,終了年,終了月)
1011    /* 戻値 array(1,2,3)
1012    /*          1.開始年月日 (YYYYMMDD 000000)
1013    /*          2.終了年月日 (YYYYMMDD 235959)
1014    /*          3.エラー (0 = OK, 1 = NG)
1015    /*-----------------------------------------------------------------*/
1016    // value[0] = 項目名1
1017    // value[1] = 項目名2
1018    // value[2] = start_year
1019    // value[3] = start_month
1020    // value[4] = end_year
1021    // value[5] = end_month
1022    function CHECK_SET_TERM3($value) {
1023
1024        // 期間指定
1025        if (isset($this->arrErr[$value[2]]) || isset($this->arrErr[$value[4]])) {
1026            return;
1027        }
1028        $this->createParam($value);
1029        $error = 0;
1030        if ((strlen($this->arrParam[$value[2]]) > 0 || strlen($this->arrParam[$value[3]]) > 0) && ! checkdate($this->arrParam[$value[3]], 1, $this->arrParam[$value[2]])) {
1031            $this->arrErr[$value[2]] = '※ ' . $value[0] . 'を正しく指定してください。<br />';
1032        }
1033        if ((strlen($this->arrParam[$value[4]]) > 0 || strlen($this->arrParam[$value[5]]) > 0) && ! checkdate($this->arrParam[$value[5]], 1, $this->arrParam[$value[4]])) {
1034            $this->arrErr[$value[4]] = '※ ' . $value[1] . 'を正しく指定してください。<br />';
1035        }
1036        if ((strlen($this->arrParam[$value[2]]) > 0 && strlen($this->arrParam[$value[3]]) > 0 && (strlen($this->arrParam[$value[4]]) > 0 || strlen($this->arrParam[$value[5]]) > 0))) {
1037
1038            $date1 = $this->arrParam[$value[2]] .sprintf('%02d', $this->arrParam[$value[3]]);
1039            $date2 = $this->arrParam[$value[4]] .sprintf('%02d', $this->arrParam[$value[5]]);
1040
1041            if (($this->arrErr[$value[2]] == '' && $this->arrErr[$value[5]] == '') && $date1 > $date2) {
1042                $this->arrErr[$value[2]] = '※ ' .$value[0]. 'と' .$value[1]. 'の期間指定が不正です。<br />';
1043            }
1044        }
1045    }
1046
1047    //ディレクトリ存在チェック
1048    function DIR_CHECK($value) {
1049        if (isset($this->arrErr[$value[1]])) {
1050            return;
1051        }
1052        $this->createParam($value);
1053        if (!is_dir($this->arrParam[$value[1]])) {
1054            $this->arrErr[$value[1]] = '※ 指定した' . $value[0] . 'は存在しません。<br />';
1055        }
1056    }
1057
1058    // ドメインチェック
1059    function DOMAIN_CHECK($value) {
1060        if (isset($this->arrErr[$value[1]])) {
1061            return;
1062        }
1063        if (strlen($this->arrParam[$value[1]]) > 0 && !preg_match("/^\.[^.]+\..+/i", $this->arrParam[$value[1]])) {
1064            $this->arrErr[$value[1]] = '※ ' . $value[0] . 'の形式が不正です。<br />';
1065        }
1066    }
1067
1068    /* 携帯メールアドレスの判定 */
1069    // メールアドレスを正規表現で判定する
1070    // value[0] = 項目名 value[1] = 判定対象メールアドレス
1071    function MOBILE_EMAIL_CHECK($value) {
1072        if (isset($this->arrErr[$value[1]])) {
1073            return;
1074        }
1075        $this->createParam($value);
1076        $objMobile = new SC_Helper_Mobile_Ex();
1077        if (strlen($this->arrParam[$value[1]]) > 0 && !$objMobile->gfIsMobileMailAddress($this->arrParam[$value[1]])) {
1078            $this->arrErr[$value[1]] = '※ ' . $value[0] . 'は携帯電話のものではありません。<br />';
1079        }
1080    }
1081
1082    /**
1083     * CHECK_REGIST_CUSTOMER_EMAIL
1084     *
1085     * メールアドレスが会員登録されているか調べる
1086     * @param array $value value[0] = 項目名 value[1] = 判定対象メールアドレス
1087     * @access public
1088     * @return void
1089     */
1090    function CHECK_REGIST_CUSTOMER_EMAIL($value) {
1091        if (isset($this->arrErr[$value[1]])) {
1092            return;
1093        }
1094        $this->createParam($value);
1095
1096        $register_user_flg =  SC_Helper_Customer_Ex::sfCheckRegisterUserFromEmail($this->arrParam[$value[1]]);
1097        switch ($register_user_flg) {
1098            case 1:
1099                $this->arrErr[$value[1]] .= '※ すでに会員登録で使用されている' . $value[0] . 'です。<br />';
1100                break;
1101            case 2:
1102                $this->arrErr[$value[1]] .= '※ 退会から一定期間の間は、同じ' . $value[0] . 'を使用することはできません。<br />';
1103                break;
1104            default:
1105                break;
1106        }
1107    }
1108
1109    /**
1110     * 禁止文字列のチェック
1111     * value[0] = 項目名 value[1] = 判定対象文字列
1112     * value[2] = 入力を禁止する文字列(配列)
1113     *
1114     * @example $objErr->doFunc(array('URL', 'contents', $arrReviewDenyURL), array('PROHIBITED_STR_CHECK'));
1115     */
1116    function PROHIBITED_STR_CHECK($value) {
1117        if (isset($this->arrErr[$value[1]]) || empty($this->arrParam[$value[1]])) {
1118            return;
1119        }
1120        $this->createParam($value);
1121        $targetStr     = $this->arrParam[$value[1]];
1122        $prohibitedStr = str_replace(array('|', '/'), array('\|', '\/'), $value[2]);
1123
1124        $pattern = '/' . join('|', $prohibitedStr) . '/i';
1125        if (preg_match_all($pattern, $this->arrParam[$value[1]], $matches)) {
1126            $this->arrErr[$value[1]] = '※ ' . $value[0] . 'は入力できません。<br />';
1127        }
1128    }
1129
1130    /**
1131     * パラメーターとして適切な文字列かチェックする.
1132     *
1133     * @access private
1134     * @param array $value [0] => 項目名, [1] => 評価する文字列
1135     * @return void
1136     */
1137    function EVAL_CHECK($value) {
1138        if (isset($this->arrErr[$value[0]])) {
1139            return;
1140        }
1141        $this->createParam($value);
1142        if ($this->evalCheck($value[1]) === false) {
1143            $this->arrErr[$value[0]] = '※ ' . $value[0] . ' の形式が不正です。<br />';
1144        }
1145    }
1146
1147    /**
1148     * パラメーターとして適切な文字列かチェックする.(サブルーチン)
1149     *
1150     * 下記を満たす場合を真とする。
1151     * ・PHPコードとして評価可能であること。
1152     * ・評価した結果がスカラデータ(定数に指定できる値)であること。
1153     * 本メソッドの利用や改訂にあたっては、eval 関数の危険性を意識する必要がある。
1154     * @access private
1155     * @param string 評価する文字列
1156     * @return bool パラメーターとして適切な文字列か
1157     */
1158    function evalCheck($value) {
1159        return @eval('return is_scalar(' . $value . ');');
1160    }
1161
1162    /**
1163     * 未定義の $this->arrParam に空要素を代入する.
1164     *
1165     * @access private
1166     * @param array $value 配列
1167     * @return void
1168     */
1169    function createParam($value) {
1170        foreach ($value as $key) {
1171            if (is_string($key) || is_int($key)) {
1172                if (!isset($this->arrParam[$key]))  $this->arrParam[$key] = '';
1173            }
1174        }
1175    }
1176
1177    /**
1178     * 値が数字だけかどうかチェックする
1179     *
1180     * @access private
1181     * @param string $string チェックする文字列
1182     * @return boolean 値が10進数の数値表現のみの場合 true
1183     */
1184    function numelicCheck($string) {
1185        /*
1186         * XXX 10進数の数値表現か否かを調べたいだけだが,
1187         * ctype_digit() は文字列以外 false を返す.
1188         * string ではなく int 型の数値が入る場合がある.
1189         */
1190        $string = (string) $string;
1191        return strlen($string) > 0 && !ctype_digit($string);
1192    }
1193}
Note: See TracBrowser for help on using the repository browser.