preg_replace返回错误的换行符?

时间:2012-04-29 16:25:15

标签: php preg-replace line-breaks

在textarea中遇到preg_replace问题。 “$”或“m”修饰符在此处无法正常工作:

<?php

$text = '1 - 2 - 3
a - b - c
foo - bar - baz';

$text_replaced = preg_replace('/^(.*) - (.*) - (.*)$/m', '$1 - $2 "$3"', $text); 

echo '
​<textarea rows=20 cols=20>
'.$text_replaced.'
</textarea>​​​​​​​​
';

应该返回

1 - 2 "3"
a - b "c"
foo - bar "baz"

但它返回

1 - 2 "3
"
a - b "c
"
foo - bar "baz"

如何解决这个问题?

尝试自己:http://codepad.viper-7.com/LqgDHg

2 个答案:

答案 0 :(得分:1)

默认.匹配除\n(LF)之外的所有内容。但是,您使用Windows样式\r\n(CRLF)换行符。因此,\r包含在匹配中。

你可能想要的是:

preg_replace('/(*ANYCRLF)^(.*) - (.*) - (.*)$/m', '$1 - $2 "$3"', $text);

(*ANYCRLF)修饰符将.的含义更改为接受除\r\n之外的所有字符。

答案 1 :(得分:0)

$text_replaced = preg_replace('/^(.*) - (.*) - (.*)[' . PHP_EOL . ']$/m', '$1 - $2 "$3"', $text);