回答編集履歴
1
PHPの文字列構文
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 さん
|