2

文字、数字、スペース、アンスコア、ハイフンのみを許可したい。

これまでのところ、このpreg_matchでうまくいくと思いました。

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

しかし、文字列内の特殊文字はエラーを生成しないことに気づきました。例えば

こんにちは"@£$joe

エラーは発生しません。少し変更して機能させることは可能ですか、それとも別の解決策が必要ですか?

4

4 に答える 4

3

問題は$シンボルにあります。文字列の終わりに一致するように具体的に要求しています。一致するため、式は一致し/[^a-z0-9 _]+$/iません。したがって、クラスを否定すると、明らかに一致しません。シンボルを削除すると、すべてが期待どおりになります。hello"@£$joejoe[a-z0-9 _]+$$

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つずつ貼り付けて、ブラウザーでテストします。

/[^a-z0-9 _]+/i.test("@hello");        // true
/[^a-z0-9 _]+/i.test("joe@");          // true
/[^a-z0-9 _]+/i.test("hello\"@£$joe"); // true
/[^a-z0-9 _]+/i.test("hello joe");     // false
于 2012-04-16T09:15:26.883 に答える
0

^キャラクタークラスの外に出す必要があります:

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

内部^(最初)の文字クラスは、文字クラスの否定子のように機能します。

于 2012-04-16T07:53:50.027 に答える
0
/^([a-z]|[A-Z]|[0-9]| |_|-)+$/

この正規表現を使用する

于 2012-04-16T07:55:25.103 に答える
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";
}
?>
于 2012-04-16T08:43:55.393 に答える