Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PHP';替换多次出现的正确语法;s preg_替换_Php_Regex_Preg Replace - Fatal编程技术网

使用PHP';替换多次出现的正确语法;s preg_替换

使用PHP';替换多次出现的正确语法;s preg_替换,php,regex,preg-replace,Php,Regex,Preg Replace,我已经用类似的想法讨论了stack overflow中的其他问题,但没有一个问题与我试图做的事情非常相似 看起来很简单,但我陷入了困境。 我试图用一个换行符来替换多次出现的换行符(\n),这样人们就不能一次提交多个换行符。 这是我试过的 $text = "Foo\n\n\nbar!\n\nfoobar!"; $text = preg_replace("#\n+#", "\n", $text); echo $text; 预期返回的语句为: Foo\nbar!\nfoobar! 但是没有雪茄!

我已经用类似的想法讨论了stack overflow中的其他问题,但没有一个问题与我试图做的事情非常相似

看起来很简单,但我陷入了困境。 我试图用一个换行符来替换多次出现的换行符(
\n
),这样人们就不能一次提交多个换行符。 这是我试过的

$text = "Foo\n\n\nbar!\n\nfoobar!";
$text = preg_replace("#\n+#", "\n", $text);
echo $text;
预期返回的语句为:

Foo\nbar!\nfoobar!
但是没有雪茄! 我试了好几次,但似乎都不管用

我做错了什么


谢谢

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

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

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

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

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

以下是最终发生的事情。我在html中有一个
div
标记,其中包含某些信息。 当用户点击按钮时,一个JS代码运行,将
div
转换为
输入
文本框,并将该文本框的值设置为原始div的html,同时用
\n
替换所有出现的

,以创建真正的换行符。 然后表单通过ajax提交到服务器

当我尝试在PHP中替换换行符时,上述建议都没有起到作用,原因很简单,它不是一个“真正的”换行符。提交到服务器的是文本
\n
。 您可能认为,按照ghostdog74的建议,在
\n
中转义反斜杠可以解决问题,但事实并非如此。我尝试了几种不同的方法来逃避,但似乎没有任何帮助

最后我参考了一些旧的正则表达式材料,发现:

许多风格还支持\Q…\E转义序列。\Q和\E之间的所有字符都被解释为文字字符。例如.\Q*\d+*\E与文本\d+匹配。可以在正则表达式结尾省略\E。。。JGsoft引擎、Perl、PCRE

下面是解决我问题的一段代码:

$text = preg_replace('#[\Q\n\E]+#', "\n", $text);

谢谢大家的帮助+1表示所有:)

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

以下是最终发生的事情。我在html中有一个
div
标记,其中包含某些信息。 当用户点击按钮时,一个JS代码运行,将
div
转换为
输入
文本框,并将该文本框的值设置为原始div的html,同时用
\n
替换所有出现的

,以创建真正的换行符。 然后表单通过ajax提交到服务器

当我尝试在PHP中替换换行符时,上述建议都没有起到作用,原因很简单,它不是一个“真正的”换行符。提交到服务器的是文本
\n
。 您可能认为,按照ghostdog74的建议,在
\n
中转义反斜杠可以解决问题,但事实并非如此。我尝试了几种不同的方法来逃避,但似乎没有任何帮助

最后我参考了一些旧的正则表达式材料,发现:

许多风格还支持\Q…\E转义序列。\Q和\E之间的所有字符都被解释为文字字符。例如.\Q*\d+*\E与文本\d+匹配。可以在正则表达式结尾省略\E。。。JGsoft引擎、Perl、PCRE

下面是解决我问题的一段代码:

$text = preg_replace('#[\Q\n\E]+#', "\n", $text);

谢谢大家的帮助+共1人:)

那么打印什么
preg#u replace(“#\n+#”、“\n”、$text)
确实产生了
Foo\nbar\恩福巴(当然是换行符,而不是文字
`和
n`)。好的,你已经说过了。但再一次:什么会被打印出来?你有没有试着在标签中重复它,只是为了确保什么会被真正打印出来?什么会被打印出来
preg#u replace(“#\n+#”、“\n”、$text)
确实产生了
Foo\nbar\恩福巴(当然是换行符,而不是文字
`和
n`)。好的,你已经说过了。但再一次:什么会被打印出来?你有没有试着在标签中重复它,只是为了确保什么会被真正打印出来?还是没有雪茄。。。我密切关注你使用的单引号和“m”,但似乎没有work@Bart:是的,单引号也不重要,但两者都不重要。我帖子的重点是支持Windows/UNIX/Mac断线。仍然没有雪茄烟。。。我密切关注你使用的单引号和“m”,但似乎没有work@Bart:是的,单引号也不重要,但两者都不重要。我的帖子的重点是支持Windows/UNIX/Mac断线。我也试过了,但似乎不起作用。我应该提到我是从一个文本区域获取数据的。我的输入可能不包含\n但包含不同的字符,我想,但我尝试了回显它,而且它看起来肯定不是这样。我也尝试过,似乎不起作用。我应该提到我是从一个文本区域获取数据的。我想我的输入可能不包含\n但包含不同的字符,但我尝试了回显它,而且它肯定不会以这种方式替换输入中的任何反斜杠和“n”字母,因为所有内容都在字符类中-这些应该是正常的,而不是方括号。此外,在这种情况下,使用单引号和三重转义(
pattern='#(\\\n)+#
)也可以正常工作,但它确实很难看。这将替换输入中的任何反斜杠和“n”字母,因为所有内容都在一个字符类中-这些应该是正常的,而不是方括号。此外,在这种情况下,使用单引号和三重转义(
pattern='.\\\n)+.'.
)也可以正常工作,但是