Насколько я понимаю, при использовании функциональности NOWDOC в PHP (v5.3 и выше) экранирование символов не требуется.
Я пытаюсь найти и заменить текст в файле 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 в том, что они позволяют помещать несколько строк текста в одну переменную.
Мой поиск и замена строк:
$pos = strpos($content, $OldString);
if ($pos !== false) {
...
а также
$content = str_replace($OldString, $NewString, $content);
Если это имеет какое-то значение, я получаю текст из файла, используя file_get_contents
,
Строковые функции, к которым вы относитесь (strpos
, str_replace
) являются бинарный сейф. Это означает, что для точного соответствия им нужно сопоставлять строки за байтом.
Ваш пример показывает разрывы строк в строках. В зависимости от платформы, они могут варьироваться. Возможно, это тот случай, когда вы ищете многострочную строку, которая по-разному закодирована в строке файла, который вы читаете, и в строке, которую вы определяете внутри своего PHP-кода.
Вы можете легко проверить это, сделав двоичную последовательность строк, с которыми вы работаете, видимой, создав их шестнадцатеричные значения:
Еще один признак при использовании var_dump
с этими строками показана неожиданно другая бинарная длина.
Других решений пока нет …