filter_var
с опцией FILTER_SANITIZE_SPECIAL_CHARS
делает то, что он должен делать:
HTML-бежать»<> & и символы со значением менее 32 ASCII, необязательно полосы или кодируют другие специальные символы .
новой строки символ (\n
) имеет значение ASCII меньше 32, поэтому оно будет преобразовано в
. Таким образом, вы можете использовать html_entity_decode, чтобы преобразовать их обратно в их исходные символы:
$string = "line 1\nline 2";
$filtered = filter_var($string, FILTER_SANITIZE_SPECIAL_CHARS);
echo "$filtered\n";
echo(html_entity_decode($filtered));
Выходы:
line 1 line 2
line 1
line 2
Но я думаю, что побеждает объект с помощью FILTER_SANITIZE_SPECIAL_CHARS
в первую очередь.
Если это только символ новой строки, который является причиной проблемы, вы можете заменить объект HTML символов (
) с символом новой строки, перед использованием nl2br()
:
echo str_replace(' ', "\n", $filtered);
Выходы:
line 1
line 2
Или, возможно, даже лучше, пропустите средний шаг и замените объект символа HTML (
) на <br />
:
echo str_replace(' ', '<br />', $filtered);
Выходы:
line 1<br />line 2
... но я не 100% уверен, что это вы пытаетесь сделать.
У вас есть код, который показывает, что новые строки преобразуются в полуколоны? – salathe