14

次のコードはなぜですか:

<?php echo preg_replace("/(.*)/", "$1.def", "abc");

?abc.def.defの代わりに出力abc.def

繰り返しが発生する理由を理解することに興味があります。

/(.+)/orを使用/^(.*)$/すると期待どおりに動作しますが、私は解決策を探しているわけではなく、質問をしているだけです (ただし、これらのパターンは答えに関連している可能性があります)。

ここでライブバージョンをいじります。

4

3 に答える 3

8

.*文字列の末尾にある空の部分文字列に一致するためです。これは、string に 2 つの一致があることを意味しますabc

  1. 文字列全体abcabc.def
  2. 空文字列 →.def

を与えabc.def.defます。


編集:それが起こる理由の詳細は、String.replaceAll() anomaly with greedy quantifiers in regex で説明されています。

于 2012-05-30T16:07:27.077 に答える
3

これは予想される動作です: https://bugs.php.net/bug.php?id=53855

これは予期された動作であり、PHP に特有のものではありません。* 量指定子を使用すると、件名文字列の末尾に「空の」一致が発生します。

于 2012-05-30T16:09:34.003 に答える
2

正規表現を欲張りで/(.*?)/ないものにすると、繰り返しのプロセス全体がはるかに大きく/目立つスケールで機能することがわかります。

.defa.defb.defc.def

a、b、c、の4つの一致が得られますempty。一方、他の人が述べたように、貪欲な正規表現を使用すると、完全な文字列と空の文字列の2つの一致が得られます。

于 2012-05-30T16:14:20.640 に答える