1

次の文字列を検討してください

breaking out a of a simple prison
this is b moving up
following me is x times better

すべての文字列はすでに小文字になっています。「ゆるい」az文字を削除したいので、次のようになります。

breaking out of simple prison
this is moving up
following me is times better

これはphpの単一の正規表現で可能ですか?

4

5 に答える 5

3
$str = "breaking out a of a simple prison
this is b moving up
following me is x times better";
$res = preg_replace("@\\b[a-z]\\b ?@i", "", $str);
echo $res;
于 2012-04-24T21:49:03.953 に答える
2

どうですか:

preg_replace('/(^|\s)[a-z](\s|$)/', '$1', $string);

これは、文字列の先頭または末尾にある単一の文字もキャッチしますが、句読点に隣接する単一の文字はキャッチしないことに注意してください (空白で囲む必要があります)。

句読点の直前の文字 (「x.」など) も削除したい場合、これはほとんどの (英語の) ケースで適切に機能するはずです。

preg_replace('/(^|\s)[a-z]\b/', '$1', $string);
于 2012-04-24T21:38:41.307 に答える
1

ワンライナーとして:

$result = preg_replace('/\s\p{Ll}\b|\b\p{Ll}\s/u', '', $subject);

\p{Ll}これは、前後に空白 ( ) がある単一の小文字 ( ) と一致し、\s両方が削除されます。単語境界 ( \b) により、1 文字のみが実際に一致することが保証されます。/u修飾子は正規表現を Unicode 対応にします。

結果: 両側のスペースで囲まれた 1 つの文字は、1 つのスペースに縮小されます。先頭に空白があり、その後に空白がない単一の文字は完全に削除されます。単一の文字の後に空白があり、前に空白はありません。

そう

This a is my test sentence a. o How funny (what a coincidence a) this is!

に変更されます

This is my test sentence. How funny (what coincidence) this is!
于 2012-04-24T21:59:07.113 に答える
1

次のようなことを試すことができます:

preg_replace('/\b\S\s\b/', "", $subject);

これが意味することは次のとおりです。

\b    # Assert position at a word boundary
\S    # Match a single character that is a “non-whitespace character”
\s    # Match a single character that is a “whitespace character” (spaces, tabs, and line breaks)
\b    # Assert position at a word boundary

アップデート

Raduによって提起されたように、私は\Sthis を使用したので、単なるa-zA-Z. にもマッチし0-9_ます。通常、これはそれよりもはるかに多く一致しますが、前に があるため、\b単語の文字にしか一致しません。

Tim Pietzckerのコメントで述べたように、件名の文字列で のような単語以外の文字が続く単一の文字を削除する必要がある場合、これは機能しないことに注意してくださいtest a (hello)。このように1文字の後に余分なスペースがある場合も倒れます

test a  hello 

ただし、式を次のように変更することで修正できます\b\S\s*\b

于 2012-04-24T21:40:10.810 に答える
0

これを試してください:

$sString = preg_replace("@\b[a-z]{1}\b@m", ' ', $sString);
于 2012-04-24T21:42:02.713 に答える