Escape — Как избежать обратного слеша, чтобы иметь безопасные строки? Переполнение стека

Я застрял в этом вопросе со вчерашнего дня, я просто хочу понять, как правильно избегать строк, я не нашел полного ответа.

вот моя проблема =>

у меня есть буксирные файлы:

  1. замена.txt, вот содержание:

    new_content ‘\ 0020’

  2. subject.txt, вот содержание:

    структура old_content

вот мой код:

$myfile = fopen ( __DIR__ . '/replacement.txt', "r" ) or die ( "Unable to open file!" );
$replacement = fread ( $myfile, filesize ( __DIR__ . '/replacement.txt' ) );
fclose ( $myfile );


$myfile = fopen ( __DIR__ . '/subject.txt', "r" ) or die ( "Unable to open file!" );
$subject = fread ( $myfile, filesize ( __DIR__ . '/subject.txt' ) );
fclose ( $myfile );

$subject = preg_replace ( "%structure.*%s", $replacement, $subject, - 1, $count );
die ( $subject );

этот код должен напечатать: new_content '\0020' но это печатает new_content 'structure old_content20' .Зачем? потому что есть обратный слеш, который не избежал.

вот что я сделал, но не повезло 🙁

  • я пытался добавить $replacement = addslashes($replacement); до preg_replaceНо вот что я получил:new_content \'\0020\', неправильно, потому что есть обратная косая черта перед кавычками.

  • я пробовал стриптиз предыдущий результат $subject = stripslashes ( $subject ), но вот что я получил: new_content '020' неверно!


единственное, что сработало для меня, это отредактировать replacement.txt к этому :
new_content '\\0020', но я не могу изменить это вручную, потому что это ввод от пользователя.


я не думаю, что проблема с обратной косой чертой, потому что если я изменю replacement.txt в new_content '\anyAlaphbetCharacter' вышеприведенный код (без аддлашей и полосок) будет печатать: new_content '\anyAlaphbetCharacter' и это правильно.

пожалуйста, помогите мне понять, что происходит? и какое решение?

1

Решение

Я хотел бы предложить вам один трюк, который должен заменить \ с каким-то особым словом, как [backslash] перед preg_replace, чтобы избежать каких-либо проблем с ним

$replacement = str_repalce(\ `, [backslash]$ замена); `

затем заменить его обратно после вызова preg_replace

$subject = str_repalce([Обратная косая],\ `, $ Субъект);`

1

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

Что здесь происходит. Я думаю, что PHP определяет \0 символ как "\0" (ASCII 0 (0x00)), the NUL-byte.

Попробуйте использовать функцию preg_quote ().

0