1

すべての文字をチェックし、次の文字のみが含まれていることを確認する必要がある文字列 (任意の長さ、最大 255 文字) があります (任意の順序である可能性があります)。

  • 文字 (az 大文字と小文字を区別しないため、AZ も)
  • 数字 (0-9)
  • ハイフン (-)
  • アンパサンド (&)
  • アポストロフィ (')
  • ピリオド (.)
  • スラッシュ (/)
  • 単一のスペースのみ (理想的には、追加の不要な空白を削除できるように、これに個別にフラグを付けることができればいいでしょう)

したがって、たとえば、次のようにすると成功します

ダウニング街 10 番地

しかし、以下はそうではありません

10、ダウニング街

正規表現はこれを行うことができますか? PHPpreg_match関数を使用します。

前もって感謝します :)

4

3 に答える 3

2

単一の文字の一致は、試みたものと同様に、文字クラスで実行できます。

[a-zA-Z0-9\-&'./]

次に、これらの文字の後に追加することにより、これらの文字の 1 つ以上の任意の数が存在できることを指定します+。しかし、255 文字を超えてはならないことを検証したいので、明示的な量指定子を使用してこれを行うこともできます{0,255}。0 から 255 までの任意の長さを許可します。ハイフンはエスケープされることに注意してください。文字クラス。i修飾子を使用してパターンの大文字と小文字を区別しないようにすることで、これを少し簡単にすることができます。

単一のスペースを一致させる要件はもう少し複雑です。これを行う方法はいくつかありますが、これらを単一のスペースに正規化したいとも言っているので、最初にこれを実行して、追加できるようにすることをお勧めします簡単にするために、スペースを文字クラスに追加します。これは、別の正規表現を使用して簡単に実行できます。

/ +/

これは、1 つ以上のスペース文字のすべてのブロックに一致するため、すべての一致を 1 つのスペースに置き換えるだけです。

文字列に含まれるスペースが 1 つだけであることがわかったので、件名の開始と終了のアサーションを使用^して、文字列全体にリスト内の文字のみが含まれていることを簡単に確認できます。$したがって、すべてをまとめると、次のようになります。

// Replace all space blocks to a single space
$normalizedSpace = preg_replace('# +#', ' ', $input);

// Validate the input contains only the chars you want
if (!preg_match('#^[a-z0-9\-&\'./ ]{0,255}$#i', $normalizedSpace)) {
    // Data invalid, handle error here
} else {
    // If you get here the data is valid
    $validData = trim($normalizedSpace);
}

trim()そうではないかもしれませんが、データも同様に必要になると思います。

于 2013-04-02T11:44:40.493 に答える
0

これは、最大 255 文字 (または空の文字列) を許可する、許可された文字と一致します。

/^[a-z0-9'.\/& -]{0,255}$/iD
于 2013-04-02T11:43:32.173 に答える
0

正規表現の範囲を否定できます:

[^a-zA-Z0-9 -'&./]

これは、az、AZ、0-9、''、'-'、''&、'.'、'/' 以外の任意の文字と一致します。

一致する場合は、文字列にエラーがあります。

これは、文字列を検証する前に対処する必要がある問題であるため、Whitspace を処理できません。

http://www.webdeveloper.com/forum/showthread.php?230179-How-do-I-reduce-multiple-spaces-into-a-single-space-using-preg_replace

于 2013-04-02T11:45:52.183 に答える