php 中难以理解的逻辑 preg_replace

incomprehensible logic preg_replace in php

我有字符串:

$string = "1\n2\n3\n4\n\n\n";

和模式:

$pattern = '/\s*$/';
// \s* - any spaces
// $   - end of string

为什么当我打电话时:

preg_replace($pattern, "\n5", $string);

输出为:

"1\n2\n3\n4\n5\n5"

我的模式有什么问题以及如何更改它,结果将是:

"1\n2\n3\n4\n5"

$ 可以匹配即将到来的换行符,也可以匹配字符串的结尾。

然而,在这种情况下,您的主要问题是 \s* 匹配 或更多空白字符。

  • 例如\n\n␄首先匹配并替换为\s*$
  • 以及第一次替换后的5\n␄

    • \s*$ 被简单地视为 $

    • 并且文本的新结尾␄仍然匹配$

    • 不像$本身总是匹配两次,而是\s*$的组合可以。

最简单的解决方法是不匹配零个空格,而是让它只吃掉现有的空格:

/\s+$/

这对你来说已经足够了,因为你只关心字符串的结尾并清除多余的换行符。