2

HTML フォームの名前フィールドから特定の文字、つまり文字、空白、一重引用符、ハイフン、ピリオドのみを許可する正規表現があります。パターンは次のとおりです。

return mb_ereg_match("^[\w\s'-\.]+$", $name);

問題は、$name にリテラル アスタリスクがある場合に、何らかの理由でこのパターンが true を返すことです。私が何かを見逃していない限り、これは不可能です。リテラル アスタリスクで複数の検索を実行しましたが、"\*"意図的に一致させるパターンだけが見つかりました。

preg_match() の同じパターンは、"*John" のような文字列が渡された場合にも一致を返します。

私は一体何が欠けているのですか?

4

3 に答える 3

2

これらのコードの前に 2 つのバックスラッシュが必要です。1 つはバックスラッシュをエスケープし、もう 1 つはエスケープ シーケンスをエスケープします。

もエスケープする必要があります-。そうしないと、「間」'との間のすべての文字が受け入れられ.ます。

return mb_ereg_match("^[\\w\\s'\\-\\.]+$", $name);

実際のケースを見てください (を使用preg_match): http://ideone.com/E8afAM

于 2012-11-07T21:36:55.067 に答える
0

HTMLフォームの名前フィールドの特定の文字、つまり文字、空白、一重引用符、ハイフン、ピリオドのみを許可する正規表現があります。

あなたが恋しい、それ\w文字ではありません。php.netによると:

「単語」文字は、任意の文字または数字、またはアンダースコア文字、つまり、Perlの「単語」の一部となる可能性のある任意の文字です。

そして、perlの定義は次のとおりです。

A\wは、単一の英数字(英字、または10進数)またはアンダースコア( "_")などの接続句読文字に一致します。

接続句読点は、私が読んだときだけを意味するはずです_が、これはおそらくマルチバイト拡張のバグです。

ユニコード全体の一致にのみ使用する場合は、php 5.1.0以降、の修飾子Unicode文字プロパティmb_ereg_match機能を試してみてください。preg_match/u

于 2012-11-07T22:20:56.420 に答える
0

角かっこで囲まれたハイフンは、範囲を示す特殊文字として機能します。あなたの場合、範囲内のすべての文字と一致してい'ます.

ハイフンをエスケープすると、目的の結果が返されます。

^[\w\s'\-\.]+$
于 2012-11-07T21:42:29.743 に答える