Вопрос по php, replace, html – Как удалить разрывы строк (без символов!) Из строки?

118

Это может показаться обманом, но будьте уверены, что это не так - я искал как SO, так и остальную часть Интернета, чтобы найти ответ на мою проблему, и в итоге нашел одинаковые недостаточные «решения». вновь и вновь. Во всяком случае, здесь это идет:

Я сохраняю пользовательский ввод из текстовой области в базу данных MySQL (в среде WordPress, но я полагаю, что это не должно иметь значения для этой проблемы). Позже он извлекается из БД для показа администраторам в серверной части сайта. Эта проблема возникает, когда пользователи отправляют текст с переносами строк (т. Е. Нажимают клавишу Enter).

Пример строки может выглядеть так:

Dear friends, I just wanted so Hello. How are you guys? I'm fine, thanks!

Greetings,
Bill

В строке нет символов конца строки (& quot; \ n & quot ;, & quot; \ r & quot; или тому подобное).

я использую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, например & quot; \ n & quot; в этом я ударил его либоstr_replace() или жеpreg_replace() и покончим с этим, но я не имею ни малейшего понятия, какую иглу использовать для этих функций, если в первую очередь там нет символов.

Я могу вручную получить доступ к соответствующему полю в БД, нажимать клавишу Backspace для каждого переноса строки, и то, что я позже хочу сделать со строкой, работает. Так что я знаю, что мне нужен вышеуказанный формат.

Если строка выглядит как ваш первый пример, то как вы можете сказать, что в ней нет символов разрыва строки? Он получил по меньшей мере два: два подряд после "спасибо!" Ernest Friedman-Hill
Я также не вижу, как можно получить новые строки без символов разрыва строки. Можете ли вы использовать шестнадцатеричный редактор для проверки строки - я уверен, что вы найдете символы для новых строк ... nettle
Справедливо, @ ErnestFriedman-Hill, вы, очевидно, правы - здесь "что-то" там ничего не видно и ничего, что я знаю. Johannes Pille

Ваш Ответ

9   ответов
309

который удаляет все переводы строки и возврат каретки. Код является:

preg_replace( "/\r|\n/", "", $yourString );

Хотя\n символы не появляются, если вы получаете возврат каретки, там есть невидимый символ. Замена preg должна захватить и исправить это.

используйте \ R (который представляет любую последовательность конца строки)stackoverflow.com/a/16274784/1491212
Обратите внимание, что это не будет соответствовать всем разрывам строк, т. Е. Тем, которые созданы в системах Windows. Чтобы поймать их, вы можете использовать следующий RegEx вместо/\r|\n|\r\n/
Невероятно. Я мог бы поклясться, что попробовал все в соответствии с вашими и @bsdnoobz ответами, которые оба делают свою работу. Ну и ладно, какой бы ментальный блок у меня там не был, вы оба сэкономили мне кучу времени. Думаю, это был довольно глупый вопрос. Спасибо, парни! Johannes Pille
5

$buffer = str_replace(array("\r\n", "\r", "\n"), "", $buffer);

"\r\n" - для Windows,"\r" - для Mac и"\n" - для Linux

Ну, я использую эту функцию, чтобы заменить разрывы строк запятыми, чтобы адрес был однострочным текстом, поэтому замена\r\n FIRST поможет, так как это означает одну запятую, а не две для каждой части, если разрыв строки
Извините, приятель, но даже после того, как мы обратились к «12», я могу с полной уверенностью сказать вам, что это излишне. Задайте себе следующие вопросы: если все\r а также\n удаляются в строке, почему бы не быть тем, кто следует друг за другом напрямую? Johannes Pille
Действительно, эта очевидная вещь не пришла мне в голову ... Спасибо :) Я только что понял, что у меня были проблемы с этим, но это было наоборот, я использовал\r\n в Windows, и он не работает в Linux.
Это все еще излишне, если вы собираетесь удалить все\r а также\rнет необходимости убирать\r\nВы можете использовать пользователяstr_replace(array("\r","\n"), "", $buffer); чтобы получить тот же результат.
@ Martin Да, вы правы, я только что понял, поэтому мы заменим\r\n сначала мы заменим\r а также\nЯ отредактировал свой ответ.
-4

почему бы не воспользоваться функцией Wordpress wpautop (), описанной здесь:https://codex.wordpress.org/Function_Reference/wpautop

Пытаться:

wpautop( $string );
4

function strip_carriage_returns($string)
{
    return str_replace(array("\n\r", "\n", "\r"), '', $string);
}

С помощьюPHP_EOL как параметр поиска замены тоже хорошая идея! Престижность.

371

Решение Бена приемлемо, ноstr_replace () намного быстрее, чемpreg_replace ()

\r", "\n"), '', $buffer);

Использование меньшей мощности процессора снижает выбросы углекислого газа в мире.

ВАЖНО: Используйте ДВОЙНЫЕ ЦИТАТЫ вокруг кодов возврата каретки и новой строки. Они не будут обработаны правильно, если вы используете одинарные кавычки!
@Joeri Учитывая, что str_replace удаляетall в любом случае, не все ли \ t \ r и \ n оба будут удалены?
@Joeri: Этот последний никогда не будет вызван, так как он будет обработан первыми двумя. Это избыточный код.
Не могу поверить, что этот ответ не заслуживает большего доверия. 100 превью до preg_replace ()
Недурно - & gt; & quot; Использование меньшей мощности процессора снижает выбросы углекислого газа в мире. & quot;
5

Ответы только на код имеют низкую ценность в StackOverflow, потому что они очень мало делают для обучения ОП и будущих читателей.
Хотя это может ответить на вопрос. Рекомендуется немного рассказать о вашем ответе.
PHP_EOL не всегда работает, когда вы читаете строку. Это когда вы их пишете.
11

nl2br() не удаляет новые строки вообще.

Returns string with <br /> or <br> inserted before all newlines (\r\n, \n\r, \n and \r).

использованиеstr_replace вместо:

$string = str_replace(array("\r\n", "\r", "\n"), "<br />", $string);
14
$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
7

Обрезка PHP

This function returns a string with whitespace stripped from the beginning and end of str. Without the second parameter, trim() will strip these characters:

" " (ASCII 32 (0x20)), an ordinary space. "\t" (ASCII 9 (0x09)), a tab. "\n" (ASCII 10 (0x0A)), a new line (line feed). "\r" (ASCII 13 (0x0D)), a carriage return. "\0" (ASCII 0 (0x00)), the NUL-byte. "\x0B" (ASCII 11 (0x0B)), a vertical tab.
Это будет предназначаться только для новых строк в начале и конце строки. Новые строки в середине строки не будут затронуты.
Именно моя мысль! Если ему не нужно пустое пространство ...

Похожие вопросы