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

时间:2013-05-22 16:23:48

标签: php regex preg-replace

只是想知道为什么我的正则表达式在字符串包含\ 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";

由于

4 个答案:

答案 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/

应该足够了。