Подтвердить что ты не робот

Str_ireplace или preg_replace заменили тэг break на\r\n

Я прочитал этот пост, в котором обсуждается вопрос о преобразовании тега html break в новую строку в php. Другие люди говорили, что это работает для них, но со мной случилось что-то странное.

это код, который я использую:

$breaks = array("<br />", "<br>", "<br/>");  
$jawaban = str_ireplace($breaks, "&#13;&#10;", $jawaban1);`     

и это код, который они используют:

$breaks = array("<br />", "<br>", "<br/>");
$text = str_ireplace($breaks, "\r\n", $text);

оба вставляют "\r\n" в текст, почему это происходит?
Скриншот: это изображение, найденное пасхальное яйцо!

если какой-либо предыдущий метод post/PHP сообщит мне

EDIT: добавление моего кода, отображающего текстовое поле

<-- THIS WONT WORK -->
$username = $_SESSION['username'];
$unsafenomorsoal = $_POST['nomorsoal'];
$unsafejawaban = $_POST['jawaban'];
$nomorsoal = mysqli_real_escape_string($konek,$unsafenomorsoal);
$jawabannotcut = substr($unsafejawaban,0,50000);
$unsafejawabanfirst = nl2br($jawabannotcut);
$jawaban1 = mysqli_real_escape_string($konek,$unsafejawabanfirst);
$breaks = array("<br />","<br>","<br/>");
$jawaban = str_ireplace($breaks, PHP_EOL, $jawaban1);
$_SESSION['textvaluejawaban'] = $jawaban;
4b9b3361

Ответ 1

Ваша проблема заключается в mysqli_real_escape_string(). Преобразует "\ r\n" в строку, чтобы сделать ее безопасной для ввода в базу данных. Удалите его полностью. Вместо этого используйте htmlspecialchars, когда вы выводите на экран:

echo htmlspecialchars($myUnsafeVar);

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

  • используйте mysqli_real_escape_string при вводе строк в базу данных. Он не будет делать то, что вы ожидаете при выводе на экран - поэтому все, что было скрыто с помощью mysql(), не должно появляться на экране.
  • используйте htmlspecialchars (которого у вас нет!) при выводе на экран.
  • используйте url_encode для добавления материала в URL
  • Существует также множество различных функций "escape" (например, вставка в JSON, вставка в mysql, вставка в другие базы данных). Используйте правильный вариант для того, что вам нужно, и не используйте его для других целей.

Проверьте функции для более подробной информации.

В настоящее время ваш код небезопасен даже при всех этих усилиях - но это очень просто исправить!

Ответ 2

попробуйте с помощью функции preg_replace() и не нужно \n\r, что вы можете делать только с \n или PHP_EOL

$jawaban = preg_replace('#<br\s*?/?>#i', "\n", $jawaban1);

или

$jawaban = preg_replace('#<br\s*?/?>#i', PHP_EOL, $jawaban1);

Ответ 3

вы должны знать об этом перед работой со строками:

  • "\n\r" означает новую строку.
  • '\n\r' не означает новую строку.
  • &#13;&#10; не означает новую строку. Это просто HTML-код для HTML-символов. Когда вы используете его, вы имеете в виду просто показать \n\r в своем браузере. это ответ на ваш вопрос:

оба вставляют "\ r\n" в текст, почему это происходит?

поэтому, зная это, вы понимаете:

если строка $jawaban1

Hello <br> and welcome!

и ваш код

$breaks = array("<br />", "<br>", "<br/>"); 
$jawaban = str_ireplace($breaks, "&#13;&#10;", $jawaban1);

Это означает, что $jawaban будет примерно таким:

Hello &#13;&#10; and welcome!

без каких-либо\n\r, и только ваш браузер показывает это следующим образом:

Hello \n\r and welcome!

Если вы хотите заменить все br на \n\r, просто используйте код в своем вопросе:

$breaks = array("<br />", "<br>", "<br/>");
$text = str_ireplace($breaks, "\r\n", $text);

О preg_replace()

Когда вы можете использовать str_ireplace, не используйте preg_replace. str_ireplace быстрее.

Не делайте этого, если вам это не нужно

в вашем коде вы сделали это:

$unsafejawabanfirst = nl2br($jawabannotcut);

и сразу после этого вы хотите заменить br\n\r. Это нравится делать и отменять. Я вижу, что вы пытаетесь показать его снова внутри элемента textarea. поэтому не заменяйте \n\r на br. решение? вообще не изменяйте \n\r, и если вы хотите сохранить его в db, просто сохраните его с помощью \r\r. если вам нужно показать вне элемента textarea, просто используйте функцию nl2br.

Ответ 4

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

На данный момент вы идете - приятное и изящное обходное решение:

Существует уже nl2br() функция, которая заменяет теги insert <br> перед новыми строковыми символами:

Пример (кодовый код):

<?php
    // Won't work
    $desc = 'Line one\nline two';
    // Should work
    $desc2 = "Line one\nline two";
    echo nl2br($desc);
    echo '<br/>';
    echo nl2br($desc2);
?>