Php 替换换行符的正则表达式
只是想知道为什么我的正则表达式在字符串包含时给我2个br标记而不是1个\n\r 我试图用以下内容替换\n、\r、\r\n和\n\r: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”
$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个
标记。在我发布问题后不久,我注意到了表达式失败的原因。你对表达式的调整涵盖了所有可能的换行组合。谢谢。我在发布问题后不久就注意到了表达式失败的原因。您对表达式的调整涵盖了所有可能的换行组合。