回答編集履歴

1 正規表現3種を1つにまとめました。

kaz.Suenaga

kaz.Suenaga score 1721

2020/07/17 21:36  投稿

きっともっと頭のいい書き方あると思いますが、 str_replace ではなくpreg_replace を使っています。
行頭・行末の1つだけの + の場合の処理が特殊になっています。
こんな感じでどうでしょう。
(行頭・行末の処理もまとめられたので修正しました)
こんな感じでどうでしょう。  
```
// 検索パターン、置換後のパターンをそれぞれ配列に
// 行頭の1文字の + の後に + 以外の1文字 → スペースと+の後の1文字
$pattern[] = '/^\+([^\+])/';
$replacement[] = ' $1';
// (行頭または+以外の1文字)+(+以外の1文字または行末)
$pattern[] = '/(^|[^\+])\+([^\+]|$)/';
$replacement[] = '$1 $2';
// + 以外の1文字の後に1文字の + (行末)→ +の前の1文字とスペース  
$pattern[] = '/([^\+])\+$/';  
$replacement[] = '$1 ';  
 
// 前後が + 以外の1文字の + → 前後の文字の間にスペース  
$pattern[] = '/([^\+])\+([^\+])/';  
$replacement[] = '$1 $2';  
// + 2文字以上 → + 1文字
$pattern[] = '/\+{2,}/';
$replacement[] = '+';
// テスト文字列
$str = '+test1+test2+++test3+';
// 正規表現置換実行
echo preg_replace($pattern, $replacement, $str);
                                               
```

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る