Заменить несколько новых строк, вкладок и пробелов
Я хочу заменить несколько символов новой строки одним символом новой строки и несколько пробелов одним пробелом.
Я пробовал preg_replace("/\n\n+/", "\n", $text);
и не удалось!
Я также делаю эту работу над $ text для форматирования.
$text = wordwrap($text, 120, '<br/>', true);
$text = nl2br($text);
$ text - это большой текст, взятый у пользователя для BLOG, и для лучшего форматирования я использую wordwrap.
Ответы
Ответ 1
Теоретически, регулярное выражение работает, но проблема в том, что не все операционные системы и браузеры отправляют только \n в конце строки. Многие также отправят.
Пытаться:
Я упростил это:
preg_replace("/(\r?\n){2,}/", "\n\n", $text);
И для решения проблемы некоторых отправлений только:
preg_replace("/[\r\n]{2,}/", "\n\n", $text);
На основании вашего обновления:
// 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);
Ответ 2
Используйте \R (который представляет любую последовательность конца строки):
$str = preg_replace('#\R+#', '</p><p>', $str);
Он был найден здесь: замена двух новых строк тегами абзаца
Документация PHP о Escape-последовательностях:
\R (разрыв строки: соответствует \n,\r и\r\n)
Ответ 3
Это ответ, как я понимаю вопрос:
// 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>';
}
Ответ 4
Вам нужен многострочный модификатор для соответствия нескольким строкам:
preg_replace("/PATTERN/m", "REPLACE", $text);
Также в вашем примере вы, кажется, заменяете 2+ строк новой строки ровно 2, что не соответствует вашему вопросу.
Ответ 5
Я хотел бы предложить что-то вроде этого:
preg_replace("/(\R){2,}/", "$1", $str);
Это позаботится обо всех символах новой строки Unicode.
Ответ 6
Я пробовал все выше, но это не сработало для меня. Затем я создал длинный путь для решения этой проблемы...
До:
echo nl2br($text);
После:
$tempData = nl2br($text);
$tempData = explode("<br />",$tempData);
foreach ($tempData as $val) {
if(trim($val) != '')
{
echo $val."<br />";
}
}
И это сработало для меня.. Я написал здесь, потому что, если кто-то пришел сюда, чтобы найти ответ, как я.
Ответ 7
Если вы просто хотите заменить несколько вкладок одной вкладкой, используйте следующий код.
preg_replace("/\s{2,}/", "\t", $string);
Ответ 8
Попробуйте следующее:
preg_replace("/[\r\n]*/", "\r\n", $text);
Ответ 9
Замените голову и конец строки или документа!
preg_replace('/(^[^a-zA-Z]+)|([^a-zA-Z]+$)/','',$match);
Ответ 10
Я имел дело с функцией 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;
}
Ключевые слова (*) и (**).