[英]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.