Php 替换换行符的正则表达式

Php 替换换行符的正则表达式,php,regex,preg-replace,Php,Regex,Preg Replace,只是想知道为什么我的正则表达式在字符串包含时给我2个br标记而不是1个\n\r 我试图用以下内容替换\n、\r、\r\n和\n\r: $string="testing \n\r testing2"; $result=preg_replace("/\r?\n|\n?\r/", "<br />", $string); echo "$result"; $string=“测试\n\r测试2”; $result=preg_replace(“/\r?\n |\n?\r/”,“,$string”

只是想知道为什么我的正则表达式在字符串包含时给我2个br标记而不是1个\n\r

我试图用以下内容替换\n、\r、\r\n和\n\r:

$string="testing \n\r testing2";
$result=preg_replace("/\r?\n|\n?\r/", "<br />", $string);
echo "$result";
$string=“测试\n\r测试2”;
$result=preg_replace(“/\r?\n |\n?\r/”,“
,$string”); 回显“$result”;

谢谢

您需要添加多行修改器:

/\r?\n|\n?\r/ms
因此:

preg\u replace(“/\r?\n | \n?\r/ms”,“
”,“$string”);
您需要添加多行修改器:

/\r?\n|\n?\r/ms
因此:

preg\u replace(“/\r?\n | \n?\r/ms”,“
”,“$string”);
为什么不使用实现相同功能的本机函数

$string="testing \n\r testing2";
echo nl2br($string);
为什么不使用实现相同功能的本机函数呢

$string="testing \n\r testing2";
echo nl2br($string);

您的表达式正在按预期执行。再看一看:

/\r?\n|\n?\r/
似乎您认为交替(
|
)应该有利于较长的匹配,即
\n\r
而不是
\r
,但事实并非如此。交替匹配首先匹配的内容,从左到右优先

因此,当遇到
\n\r
时,
\n
\r?\n
匹配并替换为

,而
\r
\n?\r
匹配并再次替换

你想要的是

/\r\n|\n\r|\r|\n/
但是我不认为
\r\n
是常用的,所以

/\n\r?|\r/

应该足够了。

您的表达式正在按预期执行。再看一看:

/\r?\n|\n?\r/
似乎您认为交替(
|
)应该有利于较长的匹配,即
\n\r
而不是
\r
,但事实并非如此。交替匹配首先匹配的内容,从左到右优先

因此,当遇到
\n\r
时,
\n
\r?\n
匹配并替换为

,而
\r
\n?\r
匹配并再次替换

你想要的是

/\r\n|\n\r|\r|\n/
但是我不认为
\r\n
是常用的,所以

/\n\r?|\r/

应足够。

上的
/\r?\n | \n?\r/
的最佳匹配项是仅由第一个字符组成的子字符串(
\n
)。这是因为正则表达式引擎在开始查找匹配的
/\r?\n/
之前会尝试查找匹配的
/\n?\r/
*这对于匹配的
始终是正确的:
之前的正则表达式部分的匹配优先于它之后的正则表达式的匹配

因此,在找到第一个匹配项后,它将从它停止的位置继续,并发现下一个字符也与正则表达式匹配。这是两个匹配项,每个匹配项都被一个

替换

请尝试改为执行
/\r\n?|\n\r?/


*(更准确地说,它先查找锚定在字符串开头的
/\r?\n/
的匹配项,然后再搜索锚定在字符串开头的
/\n?\r/
的匹配项;只有当这些搜索失败时,它才会开始查找锚定在字符串后面的匹配项。)

/\r?\n\r/
“\n\r>上的最佳匹配项
是仅由第一个字符组成的子字符串(
\n
)。这是因为正则表达式引擎在开始查找匹配的
/\r?\n/
之前会尝试查找匹配的
/\n?\r/
*这对于匹配的
始终是正确的:
之前的正则表达式部分的匹配优先于它之后的正则表达式的匹配

因此,在找到第一个匹配项后,它将从它停止的位置继续,并发现下一个字符也与正则表达式匹配。这是两个匹配项,每个匹配项都被一个

替换

请尝试改为执行
/\r\n?|\n\r?/


*(更准确地说,在搜索锚定在字符串开头的
/\r?\n/
的匹配项之前,它会先查找锚定在字符串开头的
/\n?\r/
的匹配项;只有当这些搜索失败时,它才会开始查找锚定在字符串后面的匹配项。)

我认为nl2br在新行之后添加了br标记,而不是替换它们。只需仔细检查一下,您是对的,但可以使用
stru替换(数组(“\n“,“\r”),“,$string”)来清理它是的,这样做是可能的,但我只是想通过正则表达式而不是str replace来实现。我只是有点困惑,为什么我的正则表达式对\n\r\r\n很好,但对\n\r应用了2个br标记
\n\r
不被视为单个值,但是由
\n
匹配,然后由
\r
匹配,您会得到2个

标记。我认为nl2br在新行之后添加了br标记,而不是替换它们。只需再次检查,您是对的,但可以使用
str\u替换(数组(“\n”,“\r”),“,”,$string)来清除这些标记是的,这样做是可能的,但我只是想通过正则表达式而不是str replace来实现。我只是有点困惑,为什么我的正则表达式对\n\r\r\n很好,但对\n\r应用了2个br标记
\n\r
不是一个值,而是由
\n
匹配,然后是
\r
然后是2个

标记。在我发布问题后不久,我注意到了表达式失败的原因。你对表达式的调整涵盖了所有可能的换行组合。谢谢。我在发布问题后不久就注意到了表达式失败的原因。您对表达式的调整涵盖了所有可能的换行组合。