繁体   English   中英

用于替换换行符的正则表达式

[英]Regular Expression for replacing newlines

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

我正在尝试将\\ n,\\ r,\\ r \\ n和\\ n \\ r替换为以下内容:

$string="testing \n\r testing2";
$result=preg_replace("/\r?\n|\n?\r/", "<br />", $string);
echo "$result";

谢谢

/\\r?\\n|\\n?\\r/"\\n\\r"的最佳匹配是仅包含第一个字符( \\n )的子字符串。 这是因为正则表达式引擎试图找到一个匹配/\\r?\\n/它开始寻找匹配的前/\\n?\\r/ *这始终是真正的。 | matchs:与|之前的正则表达式部分匹配。 优先于正则表达式之后的匹配项。

因此,找到第一个匹配项后,它将从中断处继续,并发现下一个字符也与正则表达式匹配。 那是2个匹配项,每个匹配项都由一个"<br />"代替。

尝试执行/\\r\\n?|\\n\\r?/

*(更确切地说,它会先搜索/\\r?\\n/锚定在字符串开头的匹配项,然后再搜索/\\n?\\r/锚定在开头的匹配项;只有在这些搜索失败的情况下,它才会开始查找以匹配稍后在字符串中定位的匹配项。)

为什么不使用实现相同功能的本机nl2br函数

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

您需要添加多行修饰符:

/\r?\n|\n?\r/ms

所以:

preg_replace("/\r?\n|\n?\r/ms", "<br />", $string);

您的表情表现理想。 再看一下:

/\r?\n|\n?\r/

看来您认为交替( | )应该支持更长的匹配, \\n\\r而不是\\r ,但事实并非如此。 交替匹配从左到右优先的first匹配。

因此,遇到\\n\\r\\n\\r?\\n匹配并替换为<br /> ,而\\r\\n?\\r匹配并再次替换。

您想要的是

/\r\n|\n\r|\r|\n/

但我不认为通常使用\\r\\n ,所以

/\n\r?|\r/

应该足够了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM