Str_ireplace или preg_replace заменили тэг break на\r\n
Я прочитал этот пост, в котором обсуждается вопрос о преобразовании тега html break в новую строку в php. Другие люди говорили, что это работает для них, но со мной случилось что-то странное.
это код, который я использую:
$breaks = array("<br />", "<br>", "<br/>");
$jawaban = str_ireplace($breaks, " ", $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;
Ответы
Ответ 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' не означает новую строку.
-
не означает новую строку. Это просто HTML-код для HTML-символов. Когда вы используете его, вы имеете в виду просто показать \n\r в своем браузере. это ответ на ваш вопрос:
оба вставляют "\ r\n" в текст, почему это происходит?
поэтому, зная это, вы понимаете:
если строка $jawaban1
Hello <br> and welcome!
и ваш код
$breaks = array("<br />", "<br>", "<br/>");
$jawaban = str_ireplace($breaks, " ", $jawaban1);
Это означает, что $jawaban будет примерно таким:
Hello 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);
?>