2012-04-16 25 views
2

文字、数字、スペース、unserscore、およびハイフンのみを許可したい。Preg_match文字列内の特殊文字を検証する

if(preg_match('/[^a-z0-9 _]+$/i', $name)) { 
$error = "Name may only contain letters, numbers, spaces, \"_\" and \"-\"."; 
} 

しかし、私は単なる文字列内の特殊文字は、エラーを生成しないことに気づい:

は、これまでのところ私はこのするpreg_matchが仕事をするだろうと思いました。例えば

hello "を@£$ジョー

エラーを発生しません。それは少し変更を加えると、それを動作させる、または私は別のソリューションを必要としないことは可能ですか?

答えて

3

問題が$記号です。特に、文字列の最後に一致するように要求しています。式/[^a-z0-9 _]+$/iは、joe[a-z0-9 _]+$と一致するため、hello"@£$joeと一致しません。クラスを否定するときは、明らかに一致しません。 $記号を削除し、すべてが期待通りになります。

if(preg_match('/[^a-z0-9 _]+/i', $name)) { 
// preg_match will return true if it finds 
// a character *other than* a-z, 0-9, space and _ 
// *anywhere* inside the string 
} 

JavaScriptコンソールに1によってこれらの行を1つずつ貼り付けることで、あなたのブラウザーでテストし、それを:

/[^a-z0-9 _]+/i.test("@hello");  // true 
/[^a-z0-9 _]+/i.test("[email protected]");   // true 
/[^a-z0-9 _]+/i.test("hello\"@£$joe"); // true 
/[^a-z0-9 _]+/i.test("hello joe");  // false 
+0

ありがとう、これは仕事をした! – 2by

+0

ありがとうございます@サルマン –

0

あなたは、文字クラス外^を持参する必要があります。

if(preg_match('/^[a-z0-9 _]+$/i', $name)) { 

内部^(先頭の)文字クラス文字クラスのネゲーターのように振る舞います。

+0

申し訳ありませんが、これは – 2by

0
/^([a-z]|[A-Z]|[0-9]| |_|-)+$/ 

使用この正規表現ここ

+0

なぜ機能しませんすべてを1つのクラスに入れないでください。 '[-_a-zA-Z0-9]' – ThiefMaster

+0

申し訳ありませんが、これはどちらでも動作しません – 2by

0

はこれを持っ:

/^[a-z0-9\s\-_]+$/i 

この表現は、ダミーデータで私がテストされています。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title>Untitled Document</title> 
<script> 
function valueanalysis(form){ 
    var vals = form.vals.value; 

    alert(/^[a-z0-9\s\-_]+$/i.test(vals)); 

    return false; 
} 
</script> 
</head> 

<body> 
<form onsubmit="return valueanalysis(this);"> 
<input type="text" name="vals"/> 
<input type="submit" value="Check" /> 
</form> 
</body> 
</html> 

このコードをHTMLファイルで使用して、値を入力して検証を確認し、その後にEnterキーを押して、trueかどうかを確認します。

注: -正規表現はすべての言語で同じです。

<?php 


if(preg_match("/^[a-z0-9\s\-_]+$/i","ASDhello-dasd asddasd_dsad")){ 
    echo "true"; 
} 
else{ 
    echo "false"; 
} 
?> 
+1

申し訳ありませんが、私はこの問題を解決できません。 – 2by

+0

これは私の場合はうまく動作しています。それぞれの価値が正しく働いています。 –

+0

ええと、あなたのコードをテストするとうまくいきます。しかし、PHPを使用している場合、これはうまくいきます: 'preg_match( '/^[a-z0-9 \ s \ -_ + $/i]、$ name)){ $ error =" 、数字、スペース、\ "_ \"、\ " - \" } ' – 2by