Заменить несколько символов новой строки, табуляции, пробела
Я хочу заменить несколько символов новой строки одним символом новой строки, несколько пробелов одним пробелом.
Я старался 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);