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


229

PHPの正規表現でスペース文字を照合する必要があります。誰かアイデアはありますか?

「gavin schulz」のように、2つの単語の間のスペースです。正規表現を使用して、文字、数字、スペースのみを許可するようにしています。しかし、どのようにスペースを見つけるのかわかりません。これは私が今持っているものです:

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

2
うーん...「a」または「b」の一致についての質問もありません...;)

回答:


368

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

1つ以上を探している場合、それは" *"2つのスペースとアスタリスク)または" +"(1つのスペースとプラス)です。

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

これらは、これまでに見たすべての *正規表現エンジンで機能します(そのうちのいくつかは、1つ以上の"+"文字を持たないものもあります)。

より近代的な正規表現エンジンの1つを使用することがわかっている場合は"\s"、そのバリエーションが適しています。さらに、単語の境界は行の最初と最後にも一致すると思います。これは、前後にスペースがなくても出現する可能性のある単語を探すときに重要です。

特にPHPの場合、このページが役立ちます。

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

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

各単語の間にスペースが1つだけあり、最初または最後にスペースがないことを確認するためのトリックも必要な場合は、少し複雑です(そしておそらく別の質問です)が、基本的な考え方は次のようになります。

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

彼の元の正規表現は「」文字を置き換えたいようです。あなたはスペースを無効にしているので、彼のスペースは意図したように「削除」されません。
2009

引用:「文字、数字、スペースのみを許可する」、Gavinの元のREは間違っていました(そのため、質問をしていました)。私のREはそれらの1つではないすべてを削除します。
paxdiablo 2009

スペースが一致パターンの最後ではなく、たとえば中央にある必要があるのはなぜですか?
ウォーレン

1
@ウォーレン、それはしません。「ここのスペース」のコメントは、スペースがどこに行くのかではなく、そこにスペースがあることを示していました(読者が気付かなかった場合)。
paxdiablo 2016年

@マイク、いいえ、そうではありません。ここでの目的は、セットに含まれていないすべての文字を置き換えることA-Za-z...です。角括弧内のキャレットがそのことを示しています。キャレットを角括弧の外に移動すると、その意味が文字列の先頭あるセットの一致する文字変わります。
paxdiablo


34

正規表現の空白について知っておくべきことはすべて次のとおりです。

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

5

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


5

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


16
これは誤りです。スペース文字だけでなく、すべての空白が収集されます。
J.テイラー

しかし、質問はPerlではなくPHPでタグ付けされています。
Peter Mortensen

4

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

次に、既に取得しているものにスペースを追加するだけです。

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

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

* a *スペースが1つだけのように具体的に必要な場合は、これよりも複雑な式が必要であり、別の非正規表現のロジックの一部を検討する必要があります。


3

単語の境界として\ bを使用することもできます。名前には、次のようなものを使用します。

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

編集これをPerlの例の正規表現に変更する

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

もう一度編集します。

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

1

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


1

このように使用して、1つのスペースを確保します。

$newtag = preg_replace("/[^a-zA-Z0-9\s]/", "", $tag)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.