содержимое файла — PHP str_replace не находит многострочный текст NOWDOC

Насколько я понимаю, при использовании функциональности 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,

0

Решение

Строковые функции, к которым вы относитесь (strpos, str_replace) являются бинарный сейф. Это означает, что для точного соответствия им нужно сопоставлять строки за байтом.

Ваш пример показывает разрывы строк в строках. В зависимости от платформы, они могут варьироваться. Возможно, это тот случай, когда вы ищете многострочную строку, которая по-разному закодирована в строке файла, который вы читаете, и в строке, которую вы определяете внутри своего PHP-кода.

Вы можете легко проверить это, сделав двоичную последовательность строк, с которыми вы работаете, видимой, создав их шестнадцатеричные значения:

Еще один признак при использовании var_dump с этими строками показана неожиданно другая бинарная длина.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]