余分なスペース (連続した空白文字のインスタンス) を 1 つのスペースに置き換えたいと思いますが、それらの余分なスペースが二重引用符または一重引用符 (または含めたい他の囲み) で囲まれていない場合に限ります。
同様の質問をいくつか見ましたが、上記の私のニーズに対する直接的な回答は見つかりませんでした。ありがとうございました!
まだ探しているか、戻ってきて確認してください。これは私にとってはうまくいくようです:
'/\s+((["\']).*?(?=\2)\2)|\s\s+/'
...と置き換えます $1
編集
\"
また、またはのようなエスケープされた引用符を許可する必要がある場合は、次の\'
式を使用できます。
'/\s+((["\'])(\\\\\2|(?!\2).)*?(?=\2)\2)|\s\s+/'
ブラケットのような「バランスの取れた」引用符 (()
または など{}
)のサポートを追加する場合は、少し粘着性があります。
編集終了
問題を見つけた場合、または説明が必要な場合はお知らせください。
願わくば最終編集と警告
/(?:^|\s+)((["\'])(\\\\\2|(?!\2).)*?(?=\2)\2)|\s\s+/
\s+
これは式の(?:^|\s+)
先頭に置き換わります.
これは、次のように、および\s
略記文字クラスを一致させたい特定の文字に置き換えることで解決できます。/(?:^|[ \t]+)((["\'])(\\\\\2|(?!\2)[\s\S])*?(?=\2)\2)|[ \t]{2,}/
例
このリンクは、 http://codepad.viper-7.comのサンプル テキストで使用されている最初の式と最後の式の例を示しています。
いくつかのステップでそれを行うことができます。次の例を検討してください。
$str = 'This is a string with "Bunch of extra spaces". Leave them "untouched !".';
$id = 0;
$buffer = array();
$str = preg_replace_callback('|".*?"|', function($m) use (&$id, &$buffer) {
$buffer[] = $m[0];
return '__' . $id++;
}, $str);
$str = preg_replace('|\s+|', ' ', $str);
$str = preg_replace_callback('|__(\d+)|', function($m) use ($buffer) {
return $buffer[$m[1]];
}, $str);
echo $str;
これにより、次の文字列が出力されます。
This is a string with "Bunch of extra spaces". Leave them "untouched !".
これは最も美しい解決策ではありませんが。