英数字以外の文字を削除するにはどうすればよいですか?


349

文字列からa-z A-Z 0-9セットにない、またはスペースでないすべての文字を削除する必要があります。

誰かがこれを行う機能を持っていますか?

回答:


695

あなたはあなたがあなたがすでに何をしたいかをほとんど知っていたように聞こえます、あなたは基本的にそれを正規表現として定義しました。

preg_replace("/[^A-Za-z0-9 ]/", '', $string);

8
zuk1:regexbuddyはその大きな助けになります
2014年

2
許可された文字としてハイフンを含める場合の例を次に示します。メールアドレスに基づいて、Moodleユーザー名から許可されていない文字を取り除く必要があるため、これが必要でした:preg_replace( "/ [^ a-z0-9 _。@ \-] /"、 ''、$ string);
Evan Donovan

2
これは、引用符(二重引用符)の代わりに、正規表現を囲むアポストロフィ(単一引用符)とまったく同じように機能しますか?例:preg_replace('/[^A-Za-z0-9 ]/', '', $string);
2540625 2015年

3
これについての説明をお願いします:)。人々はここに来て、なぜそれがそうであるかを見ます。正規表現の説明も考慮してください!ありがとう
Pratik

1
アクセント付き文字を保持したい場合はどうなりますか?
wonzbak 2016年

169

Unicode文字の場合は次のとおりです。

preg_replace("/[^[:alnum:][:space:]]/u", '', $string);

こんにちはvoondo、/ uiのことは何ですか。誰か私に光を当ててください ありがとうございました。
ケビャン14

4
明確にするために、それらはフラグと呼ばれます。これらは終了区切り文字の後に置かれ(この場合は「/」ですが、開始区切り文字と終了区切り文字が同じである限り、「〜」または「@」または使用する任意の文字にすることができます)、式の動作。
Doktor J

1
ところで、が\w含まれ\dているので\d不要です。また、結果の文字列にもアンダースコアが残るため(これもに含まれます\w)、これは誤りです。
smathy 2014

2
これにはまだエラーがあります。文字クラスは「:]」で終了する必要があるため、正しい行は次のようになります:preg_replace( "/ [^ [:alnum:] [:space:]] / ui"、 ''、 $ string);
h00ligan 2014年

4
すでに両方のケースをカバーしてiいるので、フラグは本当に必要[:alnum:]ですか?
ビリーノア2015

50

正規表現があなたの答えです。

$str = preg_replace('/[^a-z\d ]/i', '', $str);
  • iケース・小文字を区別しないの略です。
  • ^ つまり、で始まらない。
  • \d 任意の数字に一致します。
  • a-zaとの間のすべての文字に一致しますziパラメータを指定する必要がないためa-zA-Z
  • 後に\dスペースがあるので、スペースは、この正規表現で許可されています。

3
これについての説明をお願いします:)。人々はここに来て、なぜそれがそうであるかを見ます。正規表現の説明も考慮してください!誰もがあなたがそこに書いたことを説明なしに知るほど十分に進んでいるわけではありません。ありがとう
Pratik

@PratikCJoshi iは大文字と小文字を区別しません。^は、で始まらないことを意味します。\ dは任意の数字に一致します。azは、aとzの間のすべての文字に一致します。iパラメータのため、azとAZを指定する必要はありません。\ dの後にスペースがあるため、この正規表現ではスペースを使用できます。
2016

1
人々コメントを答えとして読んでいない。回答を更新してください!
Pratik、2016

18

これは本当に簡単な正規表現です:

\W|_

必要に応じて使用します(/スラッシュ区切り文字を使用)。

preg_replace("/\W|_/", '', $string);

正規表現が何をしているかを説明するこの素晴らしいツールでここでそれをテストしてください:

http://www.regexr.com/


1
それでも/uフラグが必要です。それ以外の場合は、非ASCII文字も削除されます。
Xeoncross 2014

端正ですが、スペースにも一致します。これが必要な場合は、1つ以上の文字クラスと追加の数量詞を使用して、パフォーマンスを2倍にすることができます [\W_]+
bobble bubble

18

一般的な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} ]+/', '', '你好世界!@£$%^&*()'); // 你好世界

注:これは非常に古い問題ですが、関連する質問です。私は純粋に、将来の訪問者に役立つかもしれない補足情報を提供するために答えています。


8
[\W_]+

 

$string = preg_replace("/[\W_]+/u", '', $string);

AZ、az、0-9以外のすべてを選択して削除します。

こちらの例をご覧くださいhttps : //regexr.com/3h1rj


1
この正規表現/ [\ W _] + / uはどういう意味ですか?
アンジェロ離合

\W\w文字の逆ですA-Za-z0-9_。そう\Wではないすべての文字と一致し、A-Za-z0-9_それらを削除します。[]ある文字セットの境界+文字セットの境界上の冗長ですが、通常1つの以上の文字を意味します。このuフラグは、Unicode文字のサポートを含めるように式を拡張します。つまり、などの文字コード255を超える文字は削除されませんª²³µ。さまざまな使用例3v4l.org/hSVV5とUnicode文字およびASCII文字。
fyrye


0

私も答えを探していました。私の意図は、すべての非アルファをクリーンアップすることでした。複数のスペースがあってはなりません。
だから、私はこれに対するアレックスの答えを変更しました、そしてこれは私preg_replace('/[^a-z|\s+]+/i', ' ', $name)
のために働いています 上記の正規 表現は説明に変わりsy8ed sirajul7_islamましたsy ed sirajul islam
:正規表現は大文字と小文字を区別しない方法または複数の空白の場合にaからzまでNOT ANYをチェックし、それは単一に変換されますスペース。


-2

文字列を文字に分割してフィルタリングできます。

<?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

?>

ダウン投票の理由:3v4l.org/fqLVZ さらに、長さが不明な文字列で(3 + N)関数をpreg_replace()呼び出すことは、単一の単純な呼び出しと比較すると、魅力的ではないようです。
mickmackusa
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.