查找换行符后不会立即找到换行符

时间:2009-12-01 00:56:53

标签: php regex

(在PHP中...)我正在尝试取一段文本并删除所有硬换行符,以便可以使用wordwrap()将其重新包装到特定的行长度。

但是,由于它可能有多个段落,我假设我需要一种方法来删除单个换行符,但不能连续删除两个换行符。

如果这是正确的,我怎么能在正则表达式中找到\ n而不是\ n \ n?或者我是以错误的方式接近这个?

3 个答案:

答案 0 :(得分:2)

尝试:

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

请参阅Lookahead and Lookbehind Zero-Width Assertions了解其工作原理。

这将删除换行符之前或之后的所有换行符。如果您有这个组合,则必须同时执行这两项操作:

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 \ n。可以为此调整任何一种解决方案。

答案 1 :(得分:1)

我知道你已经接受了答案,但我认为我会把它扔掉:

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

这基本上是说'替换所有'1的实例,只有1个新行“带有”空格“'。

这更像是一种猜测,因为我没有尝试过。但是没有分钟的“限制”绝对应该匹配。

答案 2 :(得分:0)

不确定这是最好的解决方案但你不能只使用正则表达式来寻找\ n \ n首先 - 用某些东西替换它(例如&lt; br&gt;) - 然后寻找\ n?