只是想知道为什么我的正则表达式在字符串包含\ 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";
由于
答案 0 :(得分:2)
/\r?\n|\n?\r/
"\n\r"
的最佳匹配是仅由第一个字符(\n
)组成的子字符串。这是因为正则表达式引擎在开始寻找/\r?\n/
的匹配项之前尝试找到/\n?\r/
的匹配项。*对于|
匹配,这始终为true:匹配部分|
之前的正则表达式优先于正则表达式之后的正则表达式。
所以,在找到第一场比赛之后,它从它停止的地方继续,并发现下一个角色也与正则表达式相匹配。这是2场比赛,每场比赛都由"<br />"
替换。
尝试改为/\r\n?|\n\r?/
。
*(更准确地说,它会在搜索开始时锚定的/\r?\n/
匹配项之前查找锚定在字符串开头的/\n?\r/
匹配项;只有当这些搜索失败时才会开始查找匹配后来在字符串中锚定。)
答案 1 :(得分:1)
为什么不使用实现相同功能的本地nl2br
函数
$string="testing \n\r testing2";
echo nl2br($string);
答案 2 :(得分:0)
您需要添加多线修改器:
/\r?\n|\n?\r/ms
这样:
preg_replace("/\r?\n|\n?\r/ms", "<br />", $string);
答案 3 :(得分:0)
您的表达式正在按预期执行。再看看:
/\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/
应该足够了。