を除くすべての特殊文字を許可できる最初の名前の正規表現を作成しようとしています。PHPで@()&
実装しようとして
/^[^0-9\@\(\)\&][a-zA-Z\s]*$/
いますが、適切に検証されていません。
2 に答える
文字列内の任意の場所に特殊文字 (これら 4 つ以外) を許可することが意図されていた場合、パターンは間違っています。
パターンを分解して、それが何をするかを説明します。
^
- 一致は行頭 (または文字列全体) から開始する必要があります。[^0-9\@\(\)\&]
-数字、 、括弧、またはアンパサンド以外の任意の1 文字に一致します。@
ちなみに、ここのスラッシュは不要だと確信しています。@
これらの文字は正規表現内で特別なものではないため、 and&
文字の前のものはほぼ確実です。(
これらの文字はサブパターンの区切り文字であるため、 andの前のものは)
必要になる可能性がありますが、文字クラス内にあるため、ここではまだ必要ないと思います。[a-zA-Z\s]*
- A と Z の間の任意の小文字または大文字、またはスペースなどの任意の空白文字に一致します (これが\s
機能します)。つまり、*
これらの文字が連続する数だけ一致するか、この位置に文字が存在しない場合は文字がまったく一致しないことを意味します。$
- 一致は行末 (または文字列全体) で終了する必要があります。
要するに、これらの 4 つの特殊文字を文字列の最初の文字から除外しているだけですが、すべての特殊文字を最初の.
これらの 4 つを除く任意の文字を文字列内の任意の位置に許可する場合は、これをパターンとして使用する必要があります。
/^[^0-9@&()]*$/
そうは言っても、物事を少し複雑にしすぎているのではないかと思います。それは一種の意見の問題ですが、正規表現は読みにくい可能性があるため、他に何かを行う方法がない場合にのみ正規表現を使用するようにしています (この質問はその良い例です)。
私がお勧めするのは、str_replace
許可していない4文字を削除するために使用し、結果の文字列を元の入力と照合することです:
if($input === str_replace(array('@', '&', '(', ')'), '', $input) {
// process valid input
} else {
// handle invalid input
}
このstr_replace
呼び出しは、元の文字列を取得し、検索配列内の値を置き換え、array('@', '&', '(', ')')
それを削除します (技術的には、何もないものに「置き換え」ます)。その後、2 つの文字列が一致する場合、無効な文字は存在せず、入力は有効です。
配列内の項目として括弧を使用しているため、要素を独自の行に分ける方が読みやすい場合があります。
$chars_to_remove = array(
'@',
'&',
'(',
')'
);
if ($input === str_replace($chars_to_replace, '', $input)) {
// process valid input
} else {
// handle invalid input
}