使用PHP的preg_replace替换多次出现的正确语法

时间:2010-02-05 07:27:02

标签: php regex preg-replace

我已经从堆栈溢出的其他问题中找到了类似的想法,但似乎没有一个类似于我正在尝试做的事情。

似乎很简单,但我在泡菜中。 我试图用一个换行符替换多次出现换行符(\n),这样人们就无法一次提交多个换行符。 这是我尝试过的。

$text = "Foo\n\n\nbar!\n\nfoobar!";
$text = preg_replace("#\n+#", "\n", $text);
echo $text;

预期返回的陈述将是:

Foo\nbar!\nfoobar!

但没有雪茄! 我尝试了几个,但似乎没有工作。

我做错了什么?

谢谢!

3 个答案:

答案 0 :(得分:3)

您可能还想检查所有三种换行符:

$text = "Foo\n\r\n\n\rbar!\n\nfoobar!";
$text = preg_replace('#(\r\n|\r|\n)+#m', "\n", $text);
echo $text;

答案 1 :(得分:1)

$text = "Foo\n\n\nbar!\n\nfoobar!";
$s = split("\n+",$text);
print_r( implode("\n",$s)); #this will join the string with newline
print_r( implode("\\n",$s)); # this will have literal \n in your string 

答案 2 :(得分:0)

如果您只对解决方案感兴趣,请跳到最后一行。

这是最终发生的事情。我在html中有一个包含特定信息的div标记。 当用户点击按钮时,运行JS代码将div转换为input文本框,并将该文本框的值设置为原始div的html,同时替换所有出现的{{{ 1}} <br>创建实际换行符。 然后,表单通过ajax提交给服务器。

当我尝试替换PHP中的换行符时,上述建议都没有帮助,原因很简单,它不是(奇怪的是)一个“真正的”换行符。提交给服务器的是文字\n。 您认为逃避\n中的反斜杠,正如ghostdog74所建议的那样可以解决问题,但事实并非如此。我试图以几种不同的方式逃避它,但似乎没有任何帮助。

我最终引用了一些旧的正则表达式材料并发现:

  

许多口味也支持\ Q ... \ E转义序列。 \ Q和\ E之间的所有字符都被解释为文字字符。例如。 \ Q * \ d + * \ E匹配文字文本 \ d + 。在正则表达式的末尾可以省略\ E ... JGsoft引擎支持这种语法,Perl,PCRE ... [source]

接下来,这是解决我问题的代码:

\n

谢谢大家的帮助!为所有人+1:)