Поиск новой строки не сразу сопровождается новой строкой - PullRequest
0 голосов
/ 01 декабря 2009

(в PHP ...) Я пытаюсь взять блок текста и удалить все жесткие разрывы строк, чтобы его можно было перенести на определенную длину строки с помощью wordwrap ().

Однако, поскольку возможно иметь несколько абзацев, я предполагаю, что мне нужен способ удалить одну новую строку, а не два подряд.

Если это правильно, как я могу сказать найти \ n, но не \ n \ n в регулярном выражении? Или я подхожу к этому неправильно?

Ответы [ 3 ]

2 голосов
/ 01 декабря 2009

Попробуйте:

preg_replace('!(?<!\n)\n(?!\n)!', '', $input);

См. Утверждения Lookahead и Lookbehind Zero-Width о том, как это работает.

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

This is some text\n\n

тогда первая не будет совпадать (новая строка не сопровождается новой строкой), так как за ней следует новая строка, но вторая будет, потому что за ней не следует новая строка (но перед ней стоит одна).

В качестве альтернативы вы можете сделать:

preg_replace_callback('!\n+!', 'replace_newline', $input);

function replace_newline($matches) {
  return strlen($matches[0]) == 1 ? '' : $matches[0];
}

Также я предположил, что вы имеете в виду только переводы строк, а не \ r. Для этого можно отрегулировать любое решение.

1 голос
/ 01 декабря 2009

Я вижу, что вы уже приняли ответ, но я решил выбросить это:

preg_replace("|\n{1}|", "");

Это в основном говорит: «замените весь экземпляр« 1 и только 1 новой строки »на« пробел »».

Это скорее предположение, так как я не пробовал. Но «предел» без минуты должен совпадать абсолютно.

0 голосов
/ 01 декабря 2009

Не уверен, что это лучшее решение, но вы не могли бы просто использовать регулярное выражение для поиска \ n \ n сначала - заменить его чем-то (например,
) - а затем искать \ n?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...