文字列から英数字のみを返す関数?


98

入力文字列を受け取り、英数字のみを残してすべての特殊文字を削除することにより、その文字列のサニタイズされたバージョンを返すphp関数を探しています。

同じことをするが、アルファベットのA〜Zだけを返す2番目の関数が必要です。

どんな助けも大歓迎です。


これらはどのUnicode正規化フォームに含まれていて、なぜこれを行いたいのですか?
tchrist

1
AZと「英数字」を言うとき、本当にAZだけを意味するのですか、それとも外国語や古いスクリプトを含むすべての言語のすべての文字を一致させたいですか?
Mark Byers

アクセントを区別しない文字列比較を実行できるようにこれを行っている場合は、間違っていることになります。
tchrist

3
それはだていないだけで、「すべての言語から」。英語です。英語はラテン文字を使用します。ありunichars '\p{Latin}' '\p{Alphabetic}' '[^A-Za-z]' | wc -l、ラテンアルファベットですが、AZではありません== 1192コード・ポイントは。英語ではASCIIで十分であるというのが一般的な見方です。そうではありません。そのため、AZの記述にはコードの匂いがあります。
tchrist

1
@スコットB:英語はAZからの26文字だけを使用するのではありません。たとえば、単語résuméにはéが含まれます。これはあなたがより良い答えを得るために役立つかもしれないので、おそらくあなたはあなたが何をしようとしているのかを説明することができます。
Mark Byers、2011年

回答:


212

警告:英語はAZだけに限定されないことに注意してください。

これを試し、az、AZ、0-9以外のすべてを削除します。

$result = preg_replace("/[^a-zA-Z0-9]+/", "", $s);

英数字の定義に外国語の文字や古いスクリプトが含まれている場合は、Unicode文字クラスを使用する必要があります。

これを試し、AZのみを残します。

$result = preg_replace("/[^A-Z]+/", "", $s);

警告の理由は、レジュメのような単語には、éこれと一致しない文字が含まれているためです。文字の特定のリストを照合する場合は、それらの文字を含むように正規表現を調整します。すべての文字を一致させる場合は、コメントに記載されている適切な文字クラスを使用してください。


2
いいえ、英数字は [\p{Alphabetic}\p{Numeric}]です。PCREのアルファベットのプロパティを忘れましたが、で概算できます[\pL\pM\pN]
tchrist

1
@tchrist:私は彼がAZに具体的に言及したいので、それだけに一致させたいと思っていると思いますが、この点に関しては質問がはるかに明確になる可能性があります。説明を求めます。
Mark Byers、2011年

1
@マーク、私はあなたの回答の2番目の部分については議論していませんでしたが、彼が最初に文字列を正規に分解していなければ、正しく機能しません。私は最初の部分について議論していました。また、私は常にカビの生えた古いASCIIだけでなく、あらゆるデータで機能する正規表現を正しくしようとしています。:)それゆえ、ミレニアムのこちら側[A-Z]は常に間違っているという時々
tchrist

1
@マーク・バイアーズ、そうですね..はい、私は好きですiが、私は英語の人口統計について心配する必要があるだけです。ところで私はあなたが1つの質問をしたことがない最高の担当者ユーザーであることに気づきました。ジョン・スキートでさえ以前に質問したことがあります!
JD Isaacks、2011年

1
なぜ正規表現の最後に+があるのですか?削除しても同じではないでしょうか?
デニス14

2

むしろよりもpreg_replace、あなたは常に使用することができますPHPのフィルタ機能を使用しfilter_var()て機能をFILTER_SANITIZE_STRING


PHPはISO Stringprepアルゴリズムにアクセスできますか?PerlとJavaはそうです。
tchrist

文字列フィルター機能は主に7ビットASCIIで動作すると思いますが、私にそれを引用しないでください。
マークベイカー

30
ユーザーが使用を求めていることを明確に行う方法を教えてくださいFILTER_SANITIZE_STRING。私の知る限り、この方法でアーカイブできる最も近いものはですがFILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH、これは文字と数字だけでなく、ドット、スラッシュ、パーセントなども残します。
Pere 2014

$ iMycleanVar = filter_var($ sStringWithNumbers、FILTER_SANITIZE_NUMBER_INT);
Sultanos

4
回答というよりはコメントのように見えます。答えを書きながら、適切な説明をしてください。
シラジアラム

0
  1. 数字[ 0-9 ]とアルファベット一般[ \ pL ]をサンタイズ:
$string = preg_replace("/[^0-9\pL]+/", "", $string)
  1. A〜Zのアルファベット(大文字と小文字を区別しない)[ a-zA-Z ]に合わせて具体的にサンタイズします。
$string = preg_replace("/[^a-zA-Z]+/", "", $string)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.