Заменить несколько символов новой строки, табуляции, пробела

Я хочу заменить несколько символов новой строки одним символом новой строки, несколько пробелов одним пробелом.
Я старался preg_replace("/\n\n+/", "\n", $text); и не удалось!

Я также делаю эту работу над $text для форматирования.

$text = wordwrap($text,120, '<br/>', true);
$text = nl2br($text);

$text - это большой текст, взятый у пользователя для BLOG, и для лучшего форматирования я использую wordwrap.

10 ответов

Решение

Теоретически, регулярное выражение работает, но проблема в том, что не все операционные системы и браузеры отправляют только \n в конце строки. Многие также отправят.

Пытаться:

Изменить: я упростил это:

preg_replace("/(\r?\n){2,}/", "\n\n", $text);

Изменить: И для решения проблемы некоторых отправки только:

preg_replace("/[\r\n]{2,}/", "\n\n", $text);

Обновление 1: на основе вашего обновления:

// Replace multiple (one ore more) line breaks with a single one.
$text = preg_replace("/[\r\n]+/", "\n", $text);

$text = wordwrap($text,120, '<br/>', true);
$text = nl2br($text);

используйте \R (который представляет любую последовательность конца строки):

$str = preg_replace('#\R+#', '</p><p>', $str);

находится здесь: http://forums.phpfreaks.com/topic/169162-solved-replacing-two-new-lines-with-paragraph-tags/

Документация PHP о Escape-последовательностях:

\R (разрыв строки: соответствует \n, \r и \r\n)

Это ответ, как я понимаю вопрос:

// normalize newlines
preg_replace('/(\r\n|\r|\n)+/', "\n", $text);
// replace whitespace characters with a single space
preg_replace('/\s+/', ' ', $text);

редактировать

Это реальная функция, которую я использую для преобразования новых строк в HTML-строки и элементы абзаца:

/**
 *
 * @param string $string
 * @return string
 */
function nl2html($text)
{
    return '<p>' . preg_replace(array('/(\r\n\r\n|\r\r|\n\n)(\s+)?/', '/\r\n|\r|\n/'),
            array('</p><p>', '<br/>'), $text) . '</p>';
}

Модификатор multiline необходим для соответствия нескольким строкам:

preg_replace("/PATTERN/m", "REPLACE", $text);

Также в вашем примере вы, кажется, заменяете 2+ новых строки ровно на 2, что не соответствует вашему вопросу.

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

До:

echo nl2br($text);

После:

$tempData = nl2br($text);
$tempData = explode("<br />",$tempData);

foreach ($tempData as $val) {
   if(trim($val) != '')
   {
      echo $val."<br />";
   }
}

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

Я хотел бы предложить что-то вроде этого:

preg_replace("/(\R){2,}/", "$1", $str);

Это позаботится обо всех символах новой строки Unicode.

Если вы просто хотите заменить несколько вкладок одной вкладкой, используйте следующий код.

preg_replace("/\s{2,}/", "\t", $string);

Я имел дело с функцией strip_tags в php, у меня были некоторые проблемы, такие как: после переноса строки затем появляется новая строка с некоторыми пробелами, а затем постоянно появляется новый перевод строки... и т. д. без каких-либо правил:(.

это мое решение для работы с strip_tags

заменить несколько пробелов на один, несколько разрывов строки на один перевод строки

надеюсь, это поможет

 function cleanHtml($html)
 {
        // clean code into script tags
        $html = preg_replace('#<script(.*?)>(.*?)</script>#is', '', $html);

        // clean code into style tags
        $html = preg_replace('/<\s*style.+?<\s*\/\s*style.*?>/si', '', $html );

        // strip html
        $string = trim(strip_tags($html));

        // replace multiple spaces on each line (keep linebreaks) with single space 
        $string = preg_replace("/[[:blank:]]+/", " ", $string); // (*)

        // replace multiple spaces of all positions (deal with linebreaks) with single linebreak
        $string = preg_replace('/\s{2,}/', "\n", $string); // (**)
        return $string;
 }

ключевые слова (*) и (**)

Замените голову и конец строки или документа!

preg_replace('/(^[^a-zA-Z]+)|([^a-zA-Z]+$)/','',$match);

Попробуй это:

preg_replace("/[\r\n]*/", "\r\n", $text); 
Другие вопросы по тегам