PHP очень странный результат - PullRequest
0 голосов
/ 09 сентября 2011

Если я сделаю это:

$comments = str_replace( "\n\n", "\n", $comments );

И это:

$comments = explode( "\n", $comments );

Тогда в цикле, как это может ...

if( strlen( $comments[ $i ] ) == 0 )

... возможно быть правдой ???

На самом деле больше нет контекста, он довольно прямолинеен, и я долгое время являюсь разработчиком PHP, это действительно меня озадачивает.

PSЯ также попробовал что-то вроде ...

$comments = str_replace( "\n\n\n", "\n", $comments );
$comments = str_replace( "\n\n", "\n", $comments );
$comments = str_replace( "\n\n", "\n", $comments );

... подряд, и у меня все еще возникает та же проблема.

Ответы [ 7 ]

1 голос
/ 09 сентября 2011

Несколько других ответов указали на возможность более двух соседних разрывов строк.

Другим простым способом для пустой строки быть частью вывода explode будет входная строка с разрывом строкив конце:

"hey\n"

(это также может произойти, если он там "\n\n")

Выполнение этого через ваш код дает вам следующий массив:

array(2) {
  [0]=>
  string(3) "hey"
  [1]=>
  string(0) ""
}
0 голосов
/ 09 сентября 2011

Я думаю, что следующее должно учитывать обе проблемы:

<?php
    $comments = "\nHello\n\n\nWorld\n\n\n\n\n";
    //replace two+ \n togheter for one \n
    $comments = preg_replace("/\n{2,}/", "\n", $comments);
    //remove if there's one at the beginning or end
    $comments = preg_replace("/(^\n|\n$)/", "", $comments);
    //should only have two elements
    print_r( explode("\n",$comments) );
?>
0 голосов
/ 09 сентября 2011

Безопасно избавьтесь от любого множественного перевода строки.Убирает начальные и конечные символы новой строки с помощью обрезки.

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

Обновление: с помощью preg_replace можно улучшить очистку - вы можете удалить любые пустые строки, которые остались бы с указанной выше.

$comments = preg_replace("/\s*\n\n\s*/", "\n", trim($comments));
0 голосов
/ 09 сентября 2011

Я думаю, что большинство функций Regex / String делают только один проход. Отсюда что-то вроде:

str_replace("\n\n", "\n", "\n\n\n\n")

даст вам

"\n\n"

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

preg_replace("[\\n]+", "\n", "\n\n\n\n")

если я правильно помню свои регулярные выражения PHP. Это заменит любой непрерывный набор из 1 или более "\ n" одним "\ n"

0 голосов
/ 09 сентября 2011

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

$comments = str_replace( "<br>", "\r\n", $comments ); //incase if there is br , change to \n
$comments = trim($comments);
$comments = preg_replace("/[\r\n]+/", "\n", $comments);
$comments = str_replace( "\n\n", "\n", $comments );
$comments = trim($comments);

$comments = explode( "\n", $comments );

, а затем

if( strlen( $comments[ $i ] ) == 0 )
0 голосов
/ 09 сентября 2011

Убедитесь, что $ comments не является пустой строкой

0 голосов
/ 09 сентября 2011

Если $ comments содержит \ n \ n \ n, то после замены это будет \ n \ n, что приведет к пустому элементу при разнесении.

...