回答:
あなたはあなたがあなたがすでに何をしたいかをほとんど知っていたように聞こえます、あなたは基本的にそれを正規表現として定義しました。
preg_replace("/[^A-Za-z0-9 ]/", '', $string);
preg_replace('/[^A-Za-z0-9 ]/', '', $string);
Unicode文字の場合は次のとおりです。
preg_replace("/[^[:alnum:][:space:]]/u", '', $string);
\w
含まれ\d
ているので\d
不要です。また、結果の文字列にもアンダースコアが残るため(これもに含まれます\w
)、これは誤りです。
i
いるので、フラグは本当に必要[:alnum:]
ですか?
正規表現があなたの答えです。
$str = preg_replace('/[^a-z\d ]/i', '', $str);
i
ケース・小文字を区別しないの略です。^
つまり、で始まらない。 \d
任意の数字に一致します。 a-z
a
との間のすべての文字に一致しますz
。i
パラメータを指定する必要がないためa-z
、A-Z
。\d
スペースがあるので、スペースは、この正規表現で許可されています。これは本当に簡単な正規表現です:
\W|_
必要に応じて使用します(/
スラッシュ区切り文字を使用)。
preg_replace("/\W|_/", '', $string);
正規表現が何をしているかを説明するこの素晴らしいツールでここでそれをテストしてください:
/u
フラグが必要です。それ以外の場合は、非ASCII文字も削除されます。
[\W_]+
一般的なAZの代わりに他の言語をサポートする必要がある場合は、以下を使用できます。
preg_replace('/[^\p{L}\p{N} ]+/', '', $string);
[^\p{L}\p{N} ]
以下の否定(定義されていない文字と一致します)文字クラスを定義します。
\p{L}
:任意の言語からの手紙。\p{N}
:任意のスクリプト内の数字。
:スペース文字。+
1〜無制限の時間の間、文字クラスに貪欲に一致します。これにより、AZだけでなく、他の言語やスクリプトの文字や数字も保持されます。
preg_replace('/[^\p{L}\p{N} ]+/', '', 'hello-world'); // helloworld
preg_replace('/[^\p{L}\p{N} ]+/', '', 'abc@~#123-+=öäå'); // abc123öäå
preg_replace('/[^\p{L}\p{N} ]+/', '', '你好世界!@£$%^&*()'); // 你好世界
注:これは非常に古い問題ですが、関連する質問です。私は純粋に、将来の訪問者に役立つかもしれない補足情報を提供するために答えています。
[\W_]+
$string = preg_replace("/[\W_]+/u", '', $string);
AZ、az、0-9以外のすべてを選択して削除します。
こちらの例をご覧ください:https : //regexr.com/3h1rj
\W
\w
文字の逆ですA-Za-z0-9_
。そう\W
ではないすべての文字と一致し、A-Za-z0-9_
それらを削除します。[]
ある文字セットの境界。+
文字セットの境界上の冗長ですが、通常1つの以上の文字を意味します。このu
フラグは、Unicode文字のサポートを含めるように式を拡張します。つまり、などの文字コード255を超える文字は削除されませんª²³µ
。さまざまな使用例3v4l.org/hSVV5とUnicode文字およびASCII文字。
preg_replace("/\W+/", '', $string)
ここでテストできます:http : //regexr.com/
文字列を文字に分割してフィルタリングできます。
<?php
function filter_alphanum($string) {
$characters = str_split($string);
$alphaNumeric = array_filter($characters,"ctype_alnum");
return join($alphaNumeric);
}
$res = filter_alphanum("a!bc!#123");
print_r($res); // abc123
?>
preg_replace()
呼び出すことは、単一の単純な呼び出しと比較すると、魅力的ではないようです。