回答編集履歴

1

PHPの文字列構文

2017/12/04 14:48

投稿

think49
think49

スコア18166

test CHANGED
@@ -1,3 +1,7 @@
1
+ ### バックトラック
2
+
3
+
4
+
1
5
  > abcに対して正規表現.*//を適用すると…
2
6
 
3
7
 
@@ -20,4 +24,60 @@
20
24
 
21
25
 
22
26
 
27
+ ### PHPの文字列構文
28
+
29
+
30
+
31
+ > ```PHP
32
+
33
+ > $test = preg_replace("/\\/","b","\");
34
+
35
+ > $test1 = preg_replace("/\/","b","\");//なぜ四つでも三つでも合致するのか...
36
+
37
+ > ```
38
+
39
+
40
+
41
+ `"/\\/"`, `"/\/"` が `/\/` と評価される為です。
42
+
43
+ `preg_replace` では文字列構文のエスケープシーケンスが必要になるわけですが、エスケープの仕様が独特で、**バックスラッシュエスケープはバックスラッシュにしか働きません**。
44
+
45
+
46
+
47
+
48
+
49
+ > phpだと\は、\\、\\でないと合致できませんでした。(厳密にいうと置換だとワーニングのみだが、合致させるだけならワーニングが表示されつつ合致されている)
50
+
51
+
52
+
53
+ 警告文が現われたのであれば内容を読んでみて下さい。おそらく、バックスラッシュエスケープに纏わる説明が出力されていると思います。
54
+
55
+
56
+
57
+ - [PHP: 文字列 - Manual](http://php.net/manual/ja/language.types.string.php)
58
+
59
+ - [Ideone.com - vg9dOv - Online PHP Interpreter & Debugging Tool](https://ideone.com/vg9dOv)
60
+
61
+
62
+
63
+ ```PHP
64
+
65
+ echo "/\\/\n";
66
+
67
+ echo preg_replace("/\\/","b","\")."\n";
68
+
69
+ echo "/\/\n";
70
+
71
+ echo preg_replace("/\/","b","\")."\n";
72
+
73
+ ```
74
+
75
+
76
+
77
+ ※特定の実装特有の問題のようなので、初めからコードを出して質問をされると良かったと思います。
78
+
79
+ 質問文からは「正規表現の問題」と受け取れますが、結果的には「PHPの文字列構文の扱いの問題」でした。
80
+
81
+
82
+
23
83
  Re: aaaaaaaa さん