Как удалить разрывы строк (без символов!) из строки?
Это может показаться обманом, но будьте уверены, что это не так - я искал ответ на свою проблему как в SO, так и в остальной части Интернета, и в итоге снова и снова находил одни и те же недостаточные "решения". В любом случае, вот оно:
Я сохраняю пользовательский ввод из текстовой области в базу данных MySQL (в среде WordPress, но, я полагаю, это не должно иметь значения для этой проблемы). Позже он извлекается из базы данных для показа администраторам в бэкэнде сайта. То проблема возникает, когда пользователи отправляют текст с разрывами строк (т. Е. нажимают клавишу Ввода).
Пример строки может выглядеть следующим образом:
Dear friends, I just wanted so Hello. How are you guys? I'm fine, thanks!
Greetings,
Bill
В строке нет символов конца строки ("\n", "\r" или подобных).
Я использую nl2br()
на нем для генерации вывода HTML, но этого недостаточно. В результате получается:
Dear friends, I just wanted so Hello. How are you guys? I'm fine, thanks!<br />
<br />
Greetings,<br />
Bill
, Который, насколько я понимаю, является ожидаемым результатом nl2br()
, поскольку он вставляет теги и не должен заменять разрывы строк в первом место?
Однако формат, который мне нужен, будет следующим:
Dear friends, I just wanted so Hello. How are you guys? I'm fine, thanks!<br /><br />Greetings,<br />Bill
Если бы в строке были символы EOL, такие как "\n", я бы ударил по ней либо str_replace()
, либо preg_replace()
и покончил с этим, но я понятия не имею, какую иглу подавать в любую из этих функций, если там вообще нет символов.
Я могу вручную получить доступ к соответствующему полю в БД, нажать пробел для каждого разрыва строки, и то, что я позже хочу сделать со строкой, работает. Поэтому я знаю, что мне нужно все вышеперечисленное формат.
9 answers
Вы должны иметь возможность заменить его на preg, который удаляет все новые строки и возвращает каретку. Код таков:
preg_replace( "/\r|\n/", "", $yourString );
Несмотря на то, что символы \n
не отображаются, если вы получаете возврат каретки, там есть невидимый символ. Предварительная замена должна захватить и исправить их.
Решение Бена приемлемо, но str_replace() намного быстрее, чем preg_replace()
$buffer = str_replace(array("\r", "\n"), '', $buffer);
Использование меньшей мощности процессора снижает мировые выбросы углекислого газа.
$str = "
Dear friends, I just wanted so Hello. How are you guys? I'm fine, thanks!<br />
<br />
Greetings,<br />
Bill";
echo str_replace(array("\n", "\r"), '', $str); // echo $str in a single line
Это потому, что nl2br()
вообще не удаляет новые строки.
Возвращает строку с
<br />
или<br>
вставлено перед всеми новыми строками (\r\n
,\n\r
,\n
и\r
).
Вместо этого используйте str_replace
:
$string = str_replace(array("\r\n", "\r", "\n"), "<br />", $string);
Для правильной работы также в Windows я бы предложил использовать
$buffer = str_replace(array("\r\n", "\r", "\n"), "", $buffer);
"\r\n"
- для Windows, "\r"
- для Mac и "\n"
- для Linux
Вы также можете использовать PHP обрезку
Эта функция возвращает строку с пробелами, удаленными от начала и конца строки str. Без второго параметра функция trim() удалит эти символы:
- "" (ASCII 32 (0x20)), обычный пробел.
- "\t" (ASCII 9 (0x09)), вкладка.
- "\n" (ASCII 10 (0x0A)), новая строка (перевод строки).
- "\r" (ASCII 13 (0x0D)), возврат каретки.
- "\0" ( ASCII 0 (0x00)), то НУЛЕВОЙ байт.
- "\X0B" (ASCII 11 (0x0B)), вертикальная вкладка.
Str_replace(PHP_EOL, null, $str);
Что-то немного более функциональное (простое в использовании в любом месте):
function strip_carriage_returns($string)
{
return str_replace(array("\n\r", "\n", "\r"), '', $string);
}
Использование PHP_EOL в качестве параметра замены поиска также является хорошей идеей! Почет.
Поскольку вы работаете с WP, почему бы не воспользоваться функцией Wordpress wpautop(), описанной здесь: https://codex.wordpress.org/Function_Reference/wpautop
Попробуйте:
wpautop( $string );