2

$ は、最後の文字である改行の直前の位置と一致しません。

理想的には /1...$/ が一致するはずですが、パターン /1....$/ で一致が発生しますが、これは間違っているようです。

その理由は何ですか?

PHP docには、ドル文字 ($) は、現在の一致点が対象文字列の末尾にある場合、または文字列の最後の文字である改行文字の直前にある場合 (デフォルト) にのみ TRUE になるアサーションであるとも書かれています。

$subject = 'abc#
123#
';
$pattern = '/1...$/';
preg_match_all($pattern,$subject,$matches); // no match

更新: 改行の \r\n 形式が原因で、余分なドットが疑われます。私は次の実験を行い、いくつかのヒントを見ました。

$pattern = '/1...(.)$/';

echo bin2hex($matches[1]); // 28

28 は \r (CR) と等しいように見えるので、基本的に $ は \r\n の前ではなく \n の前に一致します。これが私の問題の原因かもしれません。

ここに画像の説明を入力

印刷不可文字をオンにした後の画像

4

3 に答える 3

3

この問題は、ウィンドウ ファイルと Linux ファイルの改行表現の違いによるものでした

この問題の理由:

  • ウィンドウでphpファイルを作成し、PHPがインストールされているLinuxに転送しました。
  • Windows では \r\n を使用して改行を表し、Linux では \n ==> を使用するため、最初は一致するために余分なドットが必要でした。

以下の実験で同じことが確認されました:

$subject = 'abc#
123#
';
$pattern = '/1...(.)$/';
preg_match_all($pattern,$subject,$matches);
echo bin2hex($matches[1]); // 28 
// 28 is equivalent of \r or CR(carriage return)

Linuxシステムで新しいファイルを作成し、 /1...$/ が一致をキャッチします:)

同じ問題で立ち往生している場合、これが誰かの時間を節約できることを願っています。

于 2012-08-15T14:30:55.960 に答える
2

文字列は複数行です。デフォルトでは、正規表現は複数行を実行しません。mこれを行うには、修飾子を追加する必要があります。

例えば:

/1...$/m
于 2012-08-15T13:35:53.973 に答える