web-dev-qa-db-ja.com

正規表現でスペースを一致させる

PHP正規表現の空白文字と一致させる必要があります。誰かアイデアがありますか?

2つの単語の間にあるスペース、 "gavin schulz"のようなものです。文字、数字、スペースのみを許可するように、正規表現を使用しています。しかし、私はその空間の見つけ方がわからない。これは私が今持っているものです:

$newtag = preg_replace("/[^a-zA-Z0-9s|]/", "", $tag);
195
Gavin Schulz

スペースを探しているなら、それは" "(1スペース)でしょう。

あなたが1つ以上を探しているなら、それは" *"(それはtwoスペースとアスタリスク)または" +"(スペースとプラス)です。

共通のスペースを探している場合は、"[ X]"または"[ X][ X]*"または"[ X]+"を使用します。ここで、Xは物理タブ文字です(これらすべての例では、それぞれの前にスペースが1つ付いています)。

これらはevery*これまで見たことのある正規表現エンジンで動作します(それらの中には1つ以上の"+"文字さえ持っていないものもあります、ugh)。

あなたがより現代的な正規表現エンジンのうちの1つを使用することをあなたが知っているならば、"\s"とそのバリエーションは進むべき道です。さらに、単語の境界も行頭と行末に一致すると考えられます。前後にスペースを入れずに表示される単語を探している場合には重要です。

特にPHPの場合、 このページ が役に立つかもしれません。

あなたの編集から、それはあなたがすべての無効な文字を削除したいようです。これの始まりは次のとおりです(正規表現の内側のスペースに注意してください):

$newtag = preg_replace ("/[^a-zA-Z0-9 ]/", "", $tag);
#                                    ^ space here

各Wordの間にスペースが1つしかなく、開始時または終了時にスペースが1つしかないようにするには、もう少し複雑な(そしておそらく別の質問)が基本的な考え方になります。

$newtag = preg_replace ("/ +/", " ", $tag); # convert all multispaces to space
$newtag = preg_replace ("/^ /", "", $tag);  # remove space from start
$newtag = preg_replace ("/ $/", "", $tag);  # and end
320
paxdiablo

\040はスペース文字と完全に一致します。

正規表現PHP reference

新しいリンク
Regex PHPのエスケープシーケンス

42
davethegr8

これが正規表現の空白文字について知っておくべきことです。

  • [[:blank:]]スペースまたはタブのみ
  • [[:space:]]空白文字
  • \s任意の空白文字
  • \v垂直方向の空白
  • \h水平方向の空白
  • x空白を無視する
15
Fletcher Ripp

Perlでは、スイッチは\s(空白文字)です。

6
Elsporko

このような場合にREGEXを使用するのはやり過ぎになりがちです。スペース文字を見つけるには、 strpos だけでは不十分です。また、正規表現の中の空白文字について特別なことは何もありません、他の文字を検索するのと同じようにそれを検索できるはずです。つまり、パターンの空白を無効にしない限り、これはこの場合はほとんど必要ありません。

5
Kibbee

文字、数字、スペースのみを許可するように正規表現を使用しています

それからそれはあなたがすでに持っているものにスペースを追加するのと同じくらい簡単です:

$newtag = preg_replace("/[^a-zA-Z0-9 ]/", "", $tag);

(注意、意図しないと思われるs|を削除しましたか?確かにsは冗長なので、必要に応じて|を復元できます)。

のみのように* a *スペースが特に必要な場合は、これよりも複雑な式が必要になります。正規表現でない部分のロジック.

4
Peter Boughton

Wordの境界に\ bを使用することもできます。名前のために私はこのようなものを使うでしょう:

[^\b]+\b[^\b]+(\b|$)

EDITこれをPerlの例では正規表現になるように修正する

if( $fullname =~ /([^\b]+)\b[^\b]+([^\b]+)(\b|$)/ ) {
 $first_name = $1;
 $last_name = $2;
}

もう一度編集必要なものに基づいて:

$new_tag = preg_replace("/[\s\t]/","",$tag);
3
Suroot

このように使用して、単一スペースを考慮してください。

$newtag = preg_replace("/[^a-zA-Z0-9\s]/", "", $tag)
1
Ajay Singh

WordPressのブロガーが標準外のスペース文字を使用しているように見えるインスタンスで、[[:space:]]を試しています。うまくいくようです。

1
Jeremy Schultz