$data
タブ、先頭のスペース、および複数のスペースが含まれています。すべてのタブをスペースに置き換えたい。1 つのスペースで複数のスペースを使用し、先頭のスペースを削除します。
実際、この入力データを変える何か:
[ asdf asdf asdf asdf ]
出力データに:
[asdf asdf asdf asdf]
どうすればいいですか?
タブと余分なスペースをトリミングして、単一のスペースに置き換えます。
$data = preg_replace('/[ ]{2,}|[\t]/', ' ', trim($data));
$data = trim(preg_replace('/\s+/g', '', $data));
角かっこが文字列の一部ではなく、説明のために使用しているだけだとすると、次のようになります。
$new_string = trim(preg_replace('!\s+!', ' ', $old_string));
単一の正規表現でそれを実行できるかもしれませんが、かなり複雑な正規表現になります。上記ははるかに簡単です。
注:また、"AB\t\tCD" (\t はタブ) を "AB CD" に置き換えたくないことも想定しています。
$data = trim($data);
これにより、先頭 (および末尾) のスペースが削除されます。
$pattern = '/\s+/';
$data = preg_replace($pattern, ' ', $data);
これにより、1 つ以上のスペースのコレクションが 1 つのスペースに変わります。
$data = str_replace("\t", " ", $data);
それはあなたのタブを取り除きます。
$new_data = preg_replace("/[\t\s]+/", " ", trim($data));
この回答は、質問を完全に文字通りに解釈します。スペースとタブのみに関係しています。確かに、OPはおそらく、トリミング/圧縮されるものに他の種類の空白を含めたいと考えていますが、埋め込まれたCRおよび/またはLF.
まず、いくつかの定数を設定しましょう。これにより、変更が必要になった場合の理解の容易さと保守性の両方が可能になります。類似点と相違点をより簡単に比較できるように、いくつか余分なスペースを入れました。
define( 'S', '[ \t]+' ); # Stuff you want to compress; in this case ONLY spaces/tabs
define( 'L', '/\A'.S.'/' ); # stuff on the Left edge will be trimmed
define( 'M', '/'.S.'/' ); # stuff in the Middle will be compressed
define( 'R', '/'.S.'\Z/' ); # stuff on the Right edge will be trimmed
define( 'T', ' ' ); # what we want the stuff compressed To
件名の先頭と末尾を指定するために、行指向のメタ文字である典型的なandの代わりに、\A
and\Z
エスケープ文字を使用しています。このインスタンスでは、「防御的な」プログラミングと同じくらい必要なので、将来必要になる変更の価値があるため、これはそれほど重要ではありません。^
$
S
秘密のソースについて: preg_replaceのいくつかの特別なセマンティクス、つまり(強調を追加)を利用します。
パターン配列よりも置換配列の要素が少ない場合、余分なパターンは空の文字列に置き換えられます。
function trim_press( $data ){
return preg_replace( [ M, L, R ], [ T ], $data );
}
したがって、パターン文字列と置換文字列の代わりに、パターン配列と置換配列を使用しているため、余分なパターンL
とR
トリミングが発生します。
この正規表現を使用するだけです
$str = trim(preg_replace('/\s\s+/', ' ', $str));
すべてのタブとスペースを 1 つのスペースに置き換えます。
ここで、sign +
in regex は 1 回以上を意味し、パターンは、2 つ以上のスペースがある場合は常に 1 つのスペースで置き換えることを意味します