7

このエラーを言っているので、この検証ルールで何が間違っているのかを理解しようとしています。

検証ルール:

$this->form_validation->set_rules('username', 'Username', 'trim|required|xss_clean|regex_match[a-z0-9]');

エラー:

重大度:警告
メッセージ:preg_match()[function.preg-match]:区切り文字は英数字または円記号であってはなりません

4

3 に答える 3

18

まず、パターンを修正する必要があります。今のあなたのパターンはa-z0-9

それを囲む区切り文字が必要なので、次のようなものです/a-z0-9/(バックスラッシュ区切り文字を使用して Codeigniter で問題が発生した場合は、他にもいくつかのオプションがあります: PCRE 区切り文字に関するマニュアル ページを参照してください) 。

これで、文字列とその中のどこかに文字通り一致するパターンができa-z0-9ました。それを文字クラスとして一致させようとしている場合は、それを行うために再び括弧で囲む必要があることに注意してください。/[a-z0-9]/

ここで、文字列に一致する文字があるだけでなく、文字列全体が (小文字の) 英数字であることを実際に確認したかったと仮定します。その場合、フロントアンカー、一致する文字クラス、繰り返し修飾子 (空の文字列に一致させて 1 つ以上にしたくないと仮定します)、そして一致を指定するアンカーが必要です。最後まで拡張する必要があります:

/^[a-z0-9]+$/

プラスをブレー​​スに置き換え、最小、最大を指定することで、最小の長さを設定することもできます (最大を省略して、最小よりも任意の長さにできるようにします)。たとえば、/^[a-z0-9]{3,}$

したがって、3 番目のパラメーター次のようになります。

'trim|required|xss_clean|regex_match[/^[a-z0-9]+$/]'

ただし、これは実際には codeigniter では機能しないようです (2011 年 3 月の時点ではとにかくそうでした)。これは、検証ルール内でブラケットを処理する方法が原因であるため、コールバックを使用する必要があります (こちらを参照)。

コールバックの使用:

次のような関数をコントローラー (または適切なスコープ) に配置します。

public function _usernameRegex($userName) {
  if (preg_match('/^[a-z0-9]+$/', $userName ) ) 
  {
    return TRUE;
  } 
  else 
  {
    return FALSE;
  }
}

次に、関数を呼び出すルールを設定します。

set_rules('username', 'Username', 'trim|required|xss_clean|callback__usernameRegex');

注: コントローラー内でコールバック関数を作成する場合、URL アクセスを防ぐために、関数の名前の先頭にアンダースコアが付けられます。クラスを拡張するクラスを作成することでこれを行う別の方法がありますが、それCI_Form_validationはより複雑な解決策のように思えました。先頭にアンダースコアを付けて関数に名前を付ける場合は、それをルールに含める必要callback__usernameRegexがあることに注意してください。これにより、合計で 2 つのアンダースコアが作成されcallback_ます_usernameRegex。これは非常に単純であり、指摘する必要はないかもしれませんが、私には、簡単に見落とされがちなもののように思えました。カスタム コールバックを Codeigniter フォーム検証に追加するためのリンクされた回答を参照してください。の拡張に関する詳細な説明については、 を参照してCI_Form_validationください。callback_フォームの検証を拡張する場合は、関数を で参照するときにを追加する必要がないことに注意してくださいset_rules

新しいコールバックのメッセージを設定することもできます:

$this->form_validation->set_message('usernameRegex', 'The %s field must only contain lowercase letters and/or numbers');


代替ルートは、form_validation ルールで使用される Codeigniter 独自のパターン マッチを変更することです。Ellislab のフォーラムへのリンクでは、問題について説明されており、スレッドのさらに下に回避策の可能性が示されています。Codeigniter コードと指定された修正をざっと見ると、彼らが提供した提案されたソリューションは、ルールで配列を使用すると壊れる可能性があります: 再帰マッチングを使用して Codeigniter 関数の正規表現を置き換えるより良い正規表現は、両方を解決しますが、より重いものでパフォーマンスの問題に遭遇する可能性がありますルール。

form_validation ルールに対する Codeigniter のパターン マッチングは、system/libraries/Form_validation.php ファイルの 115 行目 (2.1.3 時点) にあります。

于 2012-12-21T00:20:33.617 に答える
-1

phpのpreg_matchは、英数字以外の文字で囲まれた正規表現を必要とします(通常、誰もが/を使用します)。setRules()を次のように変更します。

$this->form_validation->set_rules('username', 'Username', 'trim|required|xss_clean|regex_match[/a-z0-9/]');
于 2012-12-21T00:23:10.863 に答える