次のコードはなぜですか:
<?php echo preg_replace("/(.*)/", "$1.def", "abc");
?abc.def.defの代わりに出力abc.def
繰り返しが発生する理由を理解することに興味があります。
/(.+)/orを使用/^(.*)$/すると期待どおりに動作しますが、私は解決策を探しているわけではなく、質問をしているだけです (ただし、これらのパターンは答えに関連している可能性があります)。
ここでライブバージョンをいじります。
次のコードはなぜですか:
<?php echo preg_replace("/(.*)/", "$1.def", "abc");
?abc.def.defの代わりに出力abc.def
繰り返しが発生する理由を理解することに興味があります。
/(.+)/orを使用/^(.*)$/すると期待どおりに動作しますが、私は解決策を探しているわけではなく、質問をしているだけです (ただし、これらのパターンは答えに関連している可能性があります)。
ここでライブバージョンをいじります。
.*文字列の末尾にある空の部分文字列に一致するためです。これは、string に 2 つの一致があることを意味しますabc。
abc→abc.def.defを与えabc.def.defます。
編集:それが起こる理由の詳細は、String.replaceAll() anomaly with greedy quantifiers in regex で説明されています。
これは予想される動作です: https://bugs.php.net/bug.php?id=53855
これは予期された動作であり、PHP に特有のものではありません。* 量指定子を使用すると、件名文字列の末尾に「空の」一致が発生します。
正規表現を欲張りで/(.*?)/ないものにすると、繰り返しのプロセス全体がはるかに大きく/目立つスケールで機能することがわかります。
.defa.defb.defc.def
a、b、c、の4つの一致が得られますempty。一方、他の人が述べたように、貪欲な正規表現を使用すると、完全な文字列と空の文字列の2つの一致が得られます。