2012-01-31 25 views
2

私は学校プロジェクトの一環としてデータベースバックアップ機能を作成しています。Regex検証ルール

データベースのバックアップ名に有効な文字しか含めることができないように正規表現ルールを作成する必要があります。

「法的」とは、記号やスペースを含まない文字列を意味します。アルファベットと数字の文字のみ。

有効な文字列の例は、'31Jan2012'または'63927jkdfjsdbjk623'または'hello123backup'です。ここで

は、私のJSコードは、これまでのところです:

// Check if the input box contains the charactes a-z, A-Z ,or 0-9 with a regular expression. 

    function checkIfContainsNumbersOrCharacters(elem, errorMessage){ 
     var regexRule = new RegExp("^[\w]+$"); 
     if(regexRule.test($(elem).val())){ 
      return true; 
     }else{ 
      alert(errorMessage); 
      return false; 
     } 
    } 


//call the function 

checkIfContainsNumbersOrCharacters("#backup-name", "Input can only contain the characters a-z or 0-9."); 

けれども、しかし、グーグルの迅速なビットの後、私は、次の正規表現のルールを書いて、そこからthisツールを発見する前に私は本当に正規表現を使ったことがありません。ストリングの^ =開始

^[\w]+$ 

[/ W] = AZ/AZ/0-9

'+' =文字列の後の文字。 ??

私の機能を実行する場合、どのような文字列I入力がfalse :(を返すように見えるが間違って私のコードであるか、私が正しく正規表現のルールを使用していない

+0

JSコンソールで '/^[\ w] + $ /。test(" ads123 ")'を試してみました。 – fresskoma

+0

'新しいRegexp(" [regexp-goes-here] "、" [修飾子] ")'および '/ [regexp-goes-here]/[修飾子]は同等です。前者の場合は引用符を使用し、後者の場合は引用符を使用しないでください。 – Halcyon

+1

'+'の説明がもう少し正しいとすれば、「前のトークン(つまり '\ w')が1回以上一致する」となります。しかし、コードは、私が見ることができるから、動作するはずです。 – JimmiTh

答えて

1

これは公式スペックです:http://dev.mysql.com/doc/refman/5.0/en/identifiers.htmlが、それは非常に簡単ではありませんreserved wordsのように正規表現だけではできません。

質問に入れるだけで(正しくエスケープすることを忘れないでください)、MySQLにエラーが表示されます?たとえば、使用しているMySQLバージョンにバグがありますが、あなたのチェックが正しかったとしても、MySQLはまだ拒否するかもしれません。

+0

-1 MySQLのクエリには、検証されていない/清掃されているものは良い考えではありません。私に。 – fresskoma

+0

もちろん、正しくエスケープしてください。 – Halcyon

+2

十分に良い。私の '-1'を取り戻し、正しくエスケープすることを忘れないように注意してください:) – fresskoma

2

RegExpコンストラクタの文字列パラメータとして正規表現を宣言するときは、その正規表現をエスケープする必要があります。どちら

var regexRule = new RegExp("^[\\w]+$"); 

...と...

var regexRule = new RegExp(/^[\w]+$/); 

は動作します。

データベースのクライアント側の検証では、ブラウザでJavaScriptを無効にすることで検証が簡単に回避され、無効な/悪意のあるデータがDBに届く可能性があるので注意してください。サーバー側のデータを検証する必要がありますが、無効なデータで要求を防ぎますが、クライアント側を検証するのがよい方法です。

+0

ありがとう、私は答えを編集しました。しかし、文字列をエスケープして動作させる必要があります。 –

+2

upvotingであなたを落胆させた人は中立です。 – JimmiTh

+1

リテラルを使用している場合は、 'new RegExp'の必要はありません。 '/ asdf /'は問題ありません。 – benekastah

2

\wは[[:alnum:]]の同義語で、alnumクラスの1文字に一致します。文字クラスを使用すると、ASCII文字エンコーディングの一部ではない文字と一致する可能性があることに注意してください。これは必要な場合とそうでない場合があります。あなたが本当に一致させるつもりが[0-9A-Za-z]なら、それはあなたが使うべきものです。

+3

この場合、 '\ w'と' [\ w] 'は完全に同等です。大括弧は必要ありませんが、結果には何の違いもありません。 – JimmiTh

+0

これはJavaScriptのことですか?他の環境では、範囲内の文字はその特殊性を失います。あるいは '[\ w]'は '[:print:]'と同等の文字クラスと見なされますか? – Graham

+0

'[\ w]'は、javascript、.NET、Python、Perl、Ruby、XPathなどのすべての正規表現の方言で同じことをしますが、 '\ w'は方言がユニコードを認識しているかどうかによって、角かっこは違いはありません。 – JimmiTh

2

これは簡単です。これは動作します:

function checkValid(name) { 
    return /^\w+$/.test(name); 
} 

/^\w+$/new RegExp()のリテラル表記法です。.test関数はブール値を返すので、結果だけを返す必要があります。これもまたnew RegExp("^\\w+$")よりも読みやすくなります。文字列に2つのバックスラッシュが必要であることを指摘するために@ x3roに感謝します。

+0

-1正規表現が正常だったと言っても、エラーがあるので – fresskoma

+0

良い点。一定。 – benekastah

2

ここでの問題は、文字列内の\wを書くとき、あなたはwを逃れること、あり、そして得られた正規表現は、次のようになります。リテラル文字としてwを含む、^[w]+$RegExpコンストラクタに渡された文字列引数を持つ正規表現を作成するときは、バックスラッシュをエスケープする必要があります。つまり、new RegExp("^[\\w]+$")は、必要な正規表現を作成します。

JavaScriptによって提供されている略記を使用すると、特別なエスケープ処理を必要としないvar regex = /^[\w]+$/;を避ける方法があります。

+0

+1私はそれを見逃している、私は別の記事で数時間前に説明したとしても、 ;-) – JimmiTh

関連する問題