【问题标题】:Replacing more than x amount of new lines with 2 new lines用 2 个新行替换超过 x 个新行
【发布时间】:2012-12-21 11:24:04
【问题描述】:

我正在尝试用 2 个换行符替换 超过 个 2 个换行符。

我目前有:

$text = preg_replace('/(\r\n|\n|\r){3,}/', "\n\n", $text)

这很好用,但是新行并不总是\n 字符,所以我想知道是否可以用正确的新行字符替换它?

【问题讨论】:

  • 无法理解。哪个换行符不总是\n?你找到的那个还是你替换的那个?你的意思是如何替换\n\r,无论你找到更多的那个两次?
  • @RohitJain 我的意思是我不知道服务器将使用什么换行符;可能是\r\n,可能是\n,也可能是\r
  • 如果你有\r\n\n\r...你打算用什么替换它?
  • @Jack 为什么服务器会使用不同的换行符!?
  • @Brett 为什么服务器不应该使用不同的行尾?决定这一点的不是服务器:)

标签: php regex newline


【解决方案1】:

您可以使用back reference 替换为匹配的完全相同的换行符:-

$text = preg_replace('/(\r\n|\n|\r){3,}/', "$1$1", $text)

现在,如果 \n 匹配 3 次或更多次,它将自动替换为 \n\n。其他两个也一样。

因此,您的服务器使用的任何换行符都将用作替换。


还有一件事是,您上面的正则表达式可能会匹配单行中的不同换行符并尝试替换它。

例如: - \n\r\r\n 将匹配并替换为 \r\n\r\n。如果您想确保只匹配类似的换行符,例如:-\n\n\n,并替换为\n\n,那么您需要将您的正则表达式更改为:-

$text = preg_replace('/(\r\n|\n|\r)$1{2,}/', "$1$1", $text)

现在它将只匹配相同的连续换行符 - \n\n\n\n\n\r\r\r\r\r\r\n\r\n\r\n\r\n。并用匹配的2 occurrences 替换。

【讨论】:

  • 一个问题,这会匹配 Jack 问的新行的变体吗?只想安全。
  • @Brett .. 会的。我更新了我的帖子以添加要使用的正确正则表达式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-23
  • 1970-01-01
  • 2018-01-14
  • 1970-01-01
  • 2011-07-28
  • 2022-01-09
  • 1970-01-01
相关资源
最近更新 更多