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

回答編集履歴

1

PHPの文字列構文

2017/12/04 14:48

投稿

think49
think49

スコア18194

answer CHANGED
@@ -1,3 +1,5 @@
1
+ ### バックトラック
2
+
1
3
  > abcに対して正規表現.*//を適用すると…
2
4
 
3
5
  ```JavaScript
@@ -9,4 +11,32 @@
9
11
 
10
12
  バックトラックは発生しません。
11
13
 
14
+ ### PHPの文字列構文
15
+
16
+ > ```PHP
17
+ > $test = preg_replace("/\\/","b","\");
18
+ > $test1 = preg_replace("/\/","b","\");//なぜ四つでも三つでも合致するのか...
19
+ > ```
20
+
21
+ `"/\\/"`, `"/\/"` が `/\/` と評価される為です。
22
+ `preg_replace` では文字列構文のエスケープシーケンスが必要になるわけですが、エスケープの仕様が独特で、**バックスラッシュエスケープはバックスラッシュにしか働きません**。
23
+
24
+
25
+ > phpだと\は、\\、\\でないと合致できませんでした。(厳密にいうと置換だとワーニングのみだが、合致させるだけならワーニングが表示されつつ合致されている)
26
+
27
+ 警告文が現われたのであれば内容を読んでみて下さい。おそらく、バックスラッシュエスケープに纏わる説明が出力されていると思います。
28
+
29
+ - [PHP: 文字列 - Manual](http://php.net/manual/ja/language.types.string.php)
30
+ - [Ideone.com - vg9dOv - Online PHP Interpreter & Debugging Tool](https://ideone.com/vg9dOv)
31
+
32
+ ```PHP
33
+ echo "/\\/\n";
34
+ echo preg_replace("/\\/","b","\")."\n";
35
+ echo "/\/\n";
36
+ echo preg_replace("/\/","b","\")."\n";
37
+ ```
38
+
39
+ ※特定の実装特有の問題のようなので、初めからコードを出して質問をされると良かったと思います。
40
+ 質問文からは「正規表現の問題」と受け取れますが、結果的には「PHPの文字列構文の扱いの問題」でした。
41
+
12
42
  Re: aaaaaaaa さん