preg_replace удаляет несколько \ns

Как удалить несколько вхождений \n из приведенного ниже примера и заменить только одним вхождением \n?

В основном я просто хочу удалить несколько разрывов строк и заменить их одним разрывом строки.

\n\n\n\n\n\n\n\n \n\n \n\n\n\n\n\n\n    \n\n     \n\n     \n\n    \n\n    \n\n     \n\n     \n\n     \n     \n     \n     \n     \n     \n     \n\n     \n\n     \n\n     \nEDITION:  U.S.\n\n \nINTERNATIONAL\n\n     \nMÉXICO\n\n     \n\n     \nSet edition preference\n\n     \n\n     \n\n     \n\n     \nSign up\n\n     \nLog in\n\n     \n\n \n\n     \n\n     \n\n     \n\n\n\n\n\n\n\n\n\n\n\n     \n\n     \n\n\n \n\n \n\n     \n\n     \n\n    \n\n    \n\n     \n\n     \nHome\n\n     \nVideo\n\n     \nNewsPulse\n\n \nU.S.\n\n     \nWorld\n\n     \nPolitics\n\n     \nJustice\n\n     \nEntertainment\n\n     \nTech\n\n     \nHealth\n\n     \nLiving\n\n     \nTravel\n\n \nOpinion\n\n     \niReport\n\n     \nMoney\n\n     \nSports\n\n     \n\n    \n\n\n\n\n\n \n\n\n\n\n\n\n\n \n\n\n\n \n\n\n\n\n\n\n \n\nupdated 10:02 a.m.EDT, Fri June 3, 2011\n\n\n\n\n\n \n\n\n\n\n\nDr. Jack Kevorkian dead at 83\n\n\n\n\n\n\nThe Michigan pathologist who put assisted suicide on the world\'s medical ethics stage, apparently died of a blood clot, according to his attorney. FULL STORY

person Dylan    schedule 03.06.2011    source источник
comment
не будет ли сопоставление [\n]+ и замена его на \n работать?   -  person PeterT    schedule 03.06.2011
comment
PeterT Я только что попробовал ваш метод, но теперь ничего не возвращается. не знаю почему.   -  person Dylan    schedule 03.06.2011
comment
Какой код вы используете для замены. PeterT имеет правильное регулярное выражение для этого AFAIK   -  person Mitch Grande    schedule 03.06.2011
comment
Мне нужно заменить несколько строк одной строкой, Марио. Итак, новые строки, я полагаю.   -  person Dylan    schedule 03.06.2011
comment
PHP. текущий код: echo $archive = preg_replace([\n]+, \n, $archive);   -  person Dylan    schedule 03.06.2011
comment
Похоже, вы просто забыли разделители PCRE.   -  person mario    schedule 03.06.2011


Ответы (7)


Два пути

while(strpos($string, "\n\n") !== false)
  str_replace("\n\n", "\n", $string);

И

preg_replace("/\n+/", "\n", $string);
person dynamic    schedule 03.06.2011
comment
В моей структуре я в настоящее время использую первую версию hte, потому что, когда я писал ее 6 лет назад, мало что знал о регулярных выражениях XD (я тоже был ребячливым) - person dynamic; 03.06.2011

Это должно работать:

<?php
$string = "\n\n\n\n Text \n\n Text \n\n\n\n\n Text \n\n\n";

echo preg_replace("#[\n]+#", "\n", $string);
person Jimithus    schedule 03.06.2011
comment
Да ладно :) Ваш показывает без, так что все хорошо. Но спасибо за инфу. - person Jimithus; 03.06.2011

Если это настоящий возврат каретки, вы можете сделать это, чтобы удалить последовательные возвраты каретки:

preg_replace('/\n+/', '\n', $yourString);

В противном случае для строки '\n' вы можете сделать:

preg_replace('/(\\n)+/', '\n', $yourString);

Наконец, если вы хотите удалить все пробелы между вашим \n, вы также можете сделать "

preg_replace('/\s*\n+/', '\n', $yourString);
person malko    schedule 03.06.2011
comment
Чтобы разрыв строки работал, вам нужно заключить его в двойные кавычки, по крайней мере, в замененной части, IE "\n". - person Jimithus; 03.06.2011
comment
\n в регулярном выражении с одинарными кавычками верны (более целесообразно, чтобы PCRE интерпретировал escape-последовательности). Но строка замены действительно должна быть заполнена PHP правильной последовательностью символов. - person mario; 03.06.2011
comment
только во втором случае, когда мы хотим заменить строку '\n', мы должны сохранить заменяющую часть в виде одинарной кавычки, в других случаях требуются двойные кавычки. - person malko; 03.06.2011

Попробуйте заставить совпадение + быть жадным, используя вместо этого ++.

preg_replace('/\n++/', "\n", $yourString);
person Lethargy    schedule 03.06.2011
comment
Проблема, с которой вы столкнетесь, заключается в том, что вам нужно " вокруг замены \n, чтобы она возвращала новый символ строки. - person Jimithus; 03.06.2011
comment
О, упс. Извините, я просто скопировал это из другого примера, не глядя толком: P - person Lethargy; 03.06.2011

Странно, ни один код не работает? Пример:

$barcodes = "5312353123123



5312353123123



5312353123123";
echo(     var_dump(   $barcodes     )     . '</br>' . "\n"  );
$barcodes = preg_replace('/\n+/', "\n", $barcodes);
exit(  var_dump(   $barcodes     )     . '</br>' . "\n"  );

Вывод:

string(55) "5312353123123 5312353123123 5312353123123"
string(55) "5312353123123 5312353123123 5312353123123"

Это означает, что функция... ничего не делает?

person Yoong Kim    schedule 25.06.2012

Другой способ из примеров на справочной странице для str_replace():

// Order of replacement
$str     = "Line 1\nLine 2\rLine 3\r\nLine 4\n";
$order   = array("\r\n", "\n", "\r");
$replace = '<br />';

// Processes \r\n's first so they aren't converted twice.
$newstr = str_replace($order, $replace, $str);
person Sanford Staab    schedule 19.02.2014
comment
К вашему сведению: \R намного компактнее, чем array("\r\n", "\n", "\r"), и имеет то же значение. - person Toto; 19.02.2014

Пытаться:

$newstr = preg_replace("/\r\n\r\n|\r\r|\n\n/", "..", $str);
person tashi    schedule 26.10.2015