-1

私は午後中ずっとこの正規表現の振る舞いをグーグルで調べてきました。

$str = ' b c d w i e f g h this string';

echo preg_replace('/\s[bcdefghjklmnopqrstuvwxyzBCDEFGHJKLMNOPQRSTUVWXYZ]{1}\s/', ' ', $str);

1 つの文字 (A と I を除く) のすべてのインスタンスを単独で削除し、その場所に 1 つのスペースを残したいと考えています。このコードは、他のすべての一致で機能するようです。これは、試合が重なり合っているためだと思います。

ここではルックアラウンドが適切だと思いますが、これまで使用したことがなく、スニペットを使用できます。

編集:私が達成しようとしていることについての混乱を避けるためです。上記の文字列をこれに変えたい:

$str = ' i this string';

「A」または「I」以外のすべての単一文字が削除されていることに注意してください。

4

3 に答える 3

2

代わりにルックアラウンドを使用できます。これらは長さ 0 の一致であるため、スペースを消費しません。そこ{1}は本当にばかげています。削除できます。

echo preg_replace('/(?<=\s)[bcdefghjklmnopqrstuvwxyzBCDEFGHJKLMNOPQRSTUVWXYZ](?=\s)/', '', $str)

ここで範囲と大文字と小文字を区別しないフラグを利用し(?i)て、これらすべての文字を入力する手間を軽減できます。

echo preg_replace('/(?i)(?<=\s)[B-HJ-Z](?=\s)/', '', $str)

または単語境界もここで機能します。

echo preg_replace('/(?i)\b[B-HJ-Z]\b/', '', $str)
于 2013-07-30T22:03:30.253 に答える
1

これを試すことができます:

/(?<=\s)[b-hj-zB-HJ-Z](?=\s)/

iとの両方が必要ない場合は、範囲を変更しますI

于 2013-07-30T22:11:53.760 に答える
0

これを使用できます:

echo preg_replace('~(?i)\b[B-HJ-Z]\b~', ' ', $str);

[a-zA-Z0-9_]注意: 単一の文字を区切るためにスペースを使用する代わりに、文字からの文字と別の文字との間のゼロ幅制限である単語境界を使用します。これはスペースよりも一般的であり、(たとえば) 句読点記号を含めます。

于 2013-07-30T22:12:11.650 に答える