0

私の理解では、PHP (v5.3 以降) で NOWDOC 機能を使用する場合、文字のエスケープは必要ありません。

PHP ファイル内のテキストを検索して置換しようとしています。テキストは次のとおりです。

$OldString = <<<'EOD'
<fieldset class="foobar" id="comments">
<legend><?php echo TABLE_HEADING_COMMENTS; ?></legend>
<?php echo foobar_field('comments', '45', '3'); ?>
</fieldset>
EOD;

このテキストはターゲット PHP ファイルに表示されますが、str_replace見つかりません。どちらもありませんstr_pos(テストに使用しています)。

これは文字列の特殊文字によるものなのだろうかと思いましたが、たとえば、個別にstrposまたはを実行すると、各行が見つかります...str_replace

$OldString = <<<'EOD'
<?php echo zen_draw_textarea_field('comments', '45', '3'); ?>
EOD;

...期待どおりに動作します。

問題の原因は複数行にあるようですが、HEREDOC と NOWDOC の要点は、複数行のテキストを 1 つの変数に配置できるようにすることです。

私の検索文字列と置換文字列は次のとおりです。

$pos = strpos($content, $OldString);
if ($pos !== false) { 
   ...

$content = str_replace($OldString, $NewString, $content);

違いがある場合は、を使用してファイルからテキストを取得していますfile_get_contents

4

1 に答える 1

1

strpos( , str_replace) に関連する文字列関数はバイナリ セーフです。つまり、完全に一致させるには、文字列をバイトごとに一致させる必要があります。

あなたの例は、文字列内の改行を示しています。プラットフォームによって、それらは異なる場合があります。おそらく、読み取ったファイルの文字列と PHP コード内で定義した文字列内で異なる方法でエンコードされた複数行の文字列を探している場合です。

16 進ダンプを作成して操作する文字列のバイナリ シーケンスを表示することで、これを簡単に検証できます。

別の兆候は、var_dumpこれらの文字列を使用すると、予期しない異なるバイナリ長が表示される場合です。

于 2014-10-26T14:20:35.953 に答える