0

私はこれを実行します:

$string = preg_replace('/^([^\|]*)(?!\|\|Read)/','$1||Read',"test||Read");
echo "$string<br>";
$string = preg_replace('/^([^\|]*)(?!.*Read)/','$1||Read',"test||Read");
echo "$string<br>";

そして私はこれを手に入れます:

tes||Readt||Read
test||Read

文字列(パイプを含まない)が存在しない場合は、文字列の後に「||読み取り」を追加するという考え方です。では、なぜ最初の正規表現の*は「tes」だけを消費するのでしょうか。

2番目の正規表現は機能します。これは、アサーションの最初の*が「tes」を消費し、2番目の*が「t||」と一致するためです。。

4

1 に答える 1

2

数量詞の後にプラス記号を追加することで、より貪欲または「所有格」にすることができます。+*

 ([^\|]*+)

したがって、コードは次のようになります。

 $string = preg_replace('/^([^\|]*+)(?!\|\|Read)/','$1||Read',"test||Read");

あなたのテストケースのためにどれがt終わりを残しません。

あなたの場合、||Read常にラインエンドで発生する必要がありますか?^(.*?)$その場合は、マッチングに使用して、代わりに行末をアサートすることもできます(?<!Read)$

于 2012-08-05T13:22:21.520 に答える