teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

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

2020/07/17 12:36

投稿

kaz.Suenaga
kaz.Suenaga

スコア2042

answer CHANGED
@@ -1,23 +1,16 @@
1
1
  きっともっと頭のいい書き方あると思いますが、 str_replace ではなくpreg_replace を使っています。
2
- 行頭・行末の1つだけの + の場合の処理が特殊になっています。
3
-
4
2
  こんな感じでどうでしょう。
3
+ (行頭・行末の処理もまとめられたので修正しました)
5
4
 
5
+
6
6
  ```
7
7
  // 検索パターン、置換後のパターンをそれぞれ配列に
8
8
 
9
- // 行頭の1文字+ の後に + 以外の1文字 → スペースと+の後の1文字
9
+ // 行頭または+以外の1文字)+(+以外の1文字または行末)
10
- $pattern[] = '/^+([^+])/';
10
+ $pattern[] = '/(^|[^+])+([^+]|$)/';
11
- $replacement[] = ' $1';
11
+ $replacement[] = '$1 $2';
12
12
 
13
- // + 以外の1文字の後に1文字の + (行末)→ +の前の1文字とスペース
14
- $pattern[] = '/([^+])+$/';
15
- $replacement[] = '$1 ';
16
13
 
17
- // 前後が + 以外の1文字の + → 前後の文字の間にスペース
18
- $pattern[] = '/([^+])+([^+])/';
19
- $replacement[] = '$1 $2';
20
-
21
14
  // + 2文字以上 → + 1文字
22
15
  $pattern[] = '/+{2,}/';
23
16
  $replacement[] = '+';