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+$/
这对你来说已经足够了,因为你只关心字符串的结尾并清除多余的换行符。
我有字符串:
$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+$/
这对你来说已经足够了,因为你只关心字符串的结尾并清除多余的换行符。