英数字とスペース以外のものを削除する正規表現(PHPの場合)

I'm trying to remove, via regular expression, all but alphanumeric characters & spaces.

ここに私が達成したいと思っている転換があります。

"I am a string" → "I am a string"
"How are you?" → "How are you"
"#53-Jeff" → "53-Jeff"

これまで私はこれを持っています:

return preg_replace("/[^0-9a-zA-Z]/","", $val);

しかし、正規表現の初心者であるため、私はスペースを挿入する方法を理解することはできません。私は奇妙な結果を出した。

9
"#53-Jeff" - > "53-Jeff" ハイフンは、英数字またはスペースではありません。
追加された 著者 Hammerite,

2 答え

スペースを挿入することは、期待どおりに簡単です:

preg_replace("/[^0-9a-zA-Z ]/", "", $val);

Btw。あなたの3番目の例はわかりません: - も置き換えますか?そうでない場合は、それを文字リストにも追加する必要があります。

実行例については、こちらをご覧ください。

22
追加された
うん、基本的に大括弧は正規表現の文字列です。それは、 ^ という接頭辞が付いていない限り、内部で指定されている文字と一致します。したがって、指定した文字以外の文字に一致します。 2つの値の間の - は、共通範囲のショートカットです。 [0-9][0123456789] と基本的に同じです。
追加された 著者 poke,
ああ、無視する。それは簡単ですか?私はスペースのシンボルを探していました。愛する
追加された 著者 jeffkee,
私は最近、正規表現の構文について多くのことを学んでいます。あなたの洞察力のある説明に感謝します。 PHP/javascript/jQueryのバックグラウンド(およびAdobe PSやILの視覚的デザインのトン)から来ています。これは、私の脳の中で考えて理性をつける非常に新しい方法です。しかし、あなたのような親切な人々によって簡単になりました。私はいつか良いことを伝えたいと思っています。再度、感謝します。
追加された 著者 jeffkee,

これはうまくいくはずです:

preg_replace("/[^0-9a-zA-Z -]/", "", $val);

文字セットブロックの最後に " - "を追加するか、範囲演算子として解釈される可能性があります。

正規表現のフラグ(空白/コメントが有効な場合)によっては、 " - " の直前の "" s "または(stricter)" \ "を選択します。

6
追加された
\ s はスペースだけでなく、空白文字とマッチするので、同じではありません。また、regexpフラグは、文字クラス内の動作を変更すべきではありません。
追加された 著者 poke,
興味深いですが、私はこれがPHPのPCREの問題ではないと思います。 x (PCRE_EXTENDED)フラグは文字クラス内の空白を無視しません。
追加された 著者 poke,
PCREとICUのチャットは私の頭を越えていますが、あなたの意見にも感謝しています。
追加された 著者 jeffkee,
これは、使用されている正規表現エンジンに大きく依存します。 (例えば、ICUは、フラグがセットされていれば空白を無視し、 "\" を必要とする文字セットであっても)
追加された 著者 Regexident,
PCREではなく、それにもかかわらず、それらの落とし穴について知る価値があるので、言及する価値があることが分かった。すべての正規表現が平等に作成されるわけではありません。 ICUで言及された問題は、一度私の人生の約1時間を盗んだ。私はそれがcharセット内の無視された空白を許すことを期待したことはなかったでしょう。おそらく、実装の詳細ではなくバグです。
追加された 著者 Regexident,
PHP - 日本のコミュニティ [ja]
PHP - 日本のコミュニティ [ja]
4 参加者の

このグループではPHPについて話します。 パートナー:kotaeta.com