

以下文章があった場合、`[switch]`以外にマッチする正規表現の書き方を教えてください。

`こんにちわ。[feedback]おはよう。[switch]ありがとうございました。`

追記：  
画像の`[feedback]`にもマッチさせたい。(方法としては[switch]以外にマッチさせたいという意味です。

[![追記：画像の\[feedback\]にもマッチさせたい。\(方法としては\[switch\]以外にマッチさせたいという意味です。\)](https://i.stack.imgur.com/HrjLm.png)](https://i.stack.imgur.com/HrjLm.png)


CC BY-SA 4.0
2018-06-07T13:31:44.347
44601
2018-06-08T13:17:54.823
2018-06-08T05:27:57.250
3060
28824
question
php 正規表現
特定文字列を含む括弧で囲まれた文字列以外を正規表現マッチする書き方


[switch]とそれ以外の部分を分けるということでしたら、以下のではいかがしょうか？  
$1(ないしは\1)と$2(\2)にそれぞれ、”こんにちわ。[feedback]おはよう。”と”ありがとうございました。”が格納されます。

`(.*)\[switch\](.*)`

題意を間違えていたらごめんなさい。


CC BY-SA 4.0
2018-06-07T16:47:22.550
44603
2018-06-07T20:04:11.423
2018-06-07T20:04:11.423
10174
10174
44601
answer


例えば

  * 頭 `^, \A`
  * 尻 `$, \z`
  * `[switch]` の頭 `(?=\[switch\])`
  * `[switch]` の尻 `(?<=\[switch\])`

として

  * 文字列の頭から `[switch]` の頭まで `^(.*?)(?=\[switch\])`
  * `[switch]` の尻から `[switch]` の頭まで `(?<=\[switch\])(.*?)(?=\[switch\])`
  * `[switch]` の尻から文字列の尻まで `(?<=\[switch\])(.*?)$`

を `|` でつなげばいいのでは？

`(?:^(.*?)(?=\[switch\]))|(?:(?<=\[switch\])(.*?)(?=\[switch\]))|(?:(?<=\[switch\])(.*?)$)`

`^$` が適切か `\A\z` が適切かは場合によるので別途調整してください。

* * *

追記

文字列の頭、または `[switch]` の尻から `(?:^|(?<=\[switch\]))`  
文字列の尻、または `[switch]` の頭まで `(?:(?=\[switch\])|$)`  
って考え方でもっと単純になるかもしれません。

`(?:^|(?<=\[switch\]))(.*?)(?:(?=\[switch\])|$)`

ご参考まで。


CC BY-SA 4.0
2018-06-08T07:30:37.783
44613
2018-06-08T07:38:16.100
2018-06-08T07:38:16.100
28832
28832
44601
answer


### 正規表現にマッチする部分を削除する

「正規表現のパターンにマッチする部分以外を取り出す」のは「正規表現のパターンにマッチする部分を削除する」ことで実現できます。  
[`preg_replace`](http://php.net/manual/ja/function.preg-replace.php)
を用いて、空文字に置換すればよいです。

[code]

    <?php
    $str = '[switch]今日は。[feedback]おはよう。[switch]ありがとうございました。';
    $new_str = preg_replace('/\[switch\]/', '', $str);
    echo "$new_str\n";
    
[/code]

出力:

[code]

    今日は。[feedback]おはよう。ありがとうございました。
    
[/code]

### 文字列に一致する部分を削除する

metropolisさんのコメントで指摘されているのは、この例の場合は削除したい文字列は固定的で `[switch]`
と決まっていますので、正規表現を使う必要がないということです。  
[`str_replace`](http://php.net/manual/ja/function.str-replace.php) を使って、

[code]

    $new_str = str_replace('[switch]', '', $str);
    
[/code]

のようにすれば十分です。


CC BY-SA 4.0
2018-06-08T13:17:54.823
44623
2018-06-08T13:17:54.823
3054
44601
answer