如何使用 php 保留一些限制的空格?

Posted

技术标签:

【中文标题】如何使用 php 保留一些限制的空格?【英文标题】:How to preserve whitespace with some restrictions with php? 【发布时间】:2016-07-11 09:25:54 【问题描述】:

我正在尝试建立一个网站,人们可以在其中编写并将其发布到数据库中。文本是用<textarea> 编写的,我想保留空格作为格式。

例如,用户必须按ENTER 才能从他们正在输入的当前行进入一个新行,之后,如果他们想再次按ENTER 而不写任何内容,这意味着将有两个新行,我想将两个或两个以上的新行限制为一个空行。

Stack Overflow 有这个功能,写这行的时候,我从最后一行按了三次回车,但是你只能看到一个空格。

如何使用 php 实现这一点?我已经尝试过nl2br(),但这似乎将每个\n 更改为<br \>。我该如何解决这个问题?

实际源码:

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Untitled Document</title>
</head>

<body>
<form action="" method="post">
<textarea name="ab">
</textarea>
<button>Sub</button></form>
<?php

$post= preg_replace('/\n+/', "\n", $_POST['ab']);
echo nl2br($post);
 
 //echo str_replace($find,$replace,$post);

 
 ?>
</body>
</html>

这是输出的 html 源代码:

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Untitled Document</title>
</head>

<body>
<form action="" method="post">
<textarea name="ab">
</textarea>
<button>Sub</button></form>
This is a single line.<br />
now I pressed enter,<br />
<br />
<br />
three spaces below (should show only 1 whitespace)</body>
</html>

看看nl2br创建的&lt;br /&gt;,我希望连续的&lt;br /r&gt;&lt;p&gt;...&lt;/p&gt;

这就是我想要的输出 html 源代码:

<!doctype html>
    <html>
    <head>
    <meta charset="utf-8">
    <title>Untitled Document</title>
    </head>
    
    <body>
    <form action="" method="post">
    <textarea name="ab">
    </textarea>
    <button>Sub</button></form>
    This is a single line.<br />
    now I pressed enter,<br />
    <p>
    three spaces below (should show only 1 whitespace)</p></body>
    </html>

【问题讨论】:

您想在人们在文本区域中输入时阻止它,或者只是在提交表单后清理多行空白? 我想在提交后清理多行换行符。 这个答案应该会有所帮助:***.com/questions/4052792 @mark.hch 还是不行。 这不起作用不是有用的信息。您应该发布来自 `$_POST['ab']` 的确切传入数据,并给出该特定输入所需输出的示例。请编辑您的问题以添加此信息。 【参考方案1】:

根据您的新输入优化我的答案:

$input = "This is a single line.\nnow I pressed enter,\n\n\nthree spaces below (should show only 1 whitespace)";

$output = preg_replace('/\n\n+([^\n]+)/', "\n" . '<p>$1</p>', $input);
echo nl2br($output);

输出:

This is a single line.<br />
now I pressed enter,<br />
<p>three spaces below (should show only 1 whitespace)</p>

【讨论】:

查看我的问题中的 html 源输出。 @maxhb 尝试像这样$input=$_POST['ab']; $output = preg_replace('/\n\n+([^\n]+)/', "\n" . '&lt;p&gt;$1&lt;/p&gt;', $input); echo nl2br($output); 这样做因为您将\n 直接放入字符串中,所以它可以工作,但在textarea 的情况下它不起作用@maxhb 【参考方案2】:

您可能在 Windows 上,其中换行符是 \r\n,而不是像其他系统那样的 \n。事实上,根据this answer,浏览器应该总是将文本区域的换行符标准化为\r\n。所以也许这就是问题所在。

您希望单独保留单个换行符,2 个换行符保留为 2 个换行符,但 3 个或更多换行符应折叠为 2 个换行符。所以试试:

$post=preg_replace('/(\r\n)3,/', "\n\n", $_POST['ab']);
echo nl2br($post);

要折叠 2 个或更多换行符以正确关闭 &lt;p&gt;s,就像您在示例输出中所做的那样,有点困难,我不确定您能否可靠地做到这一点,因为它依赖于用户创建 2 个换行符指示&lt;p&gt; 的开始和结束的另外2 个换行符。如果它们不包含 2 个结束换行符,则您的正则表达式没有结束标记,它将无法匹配。我认为坚持使用 2 &lt;br&gt;s 更安全。

顺便说一句,“空白”是指任何空格字符,包括空格、制表符和换行符; “空格”是指连续单词之间的空格; “换行符”表示换行符。您的问题混淆并互换了这些术语,在最初的几次阅读中很难理解。

【讨论】:

效果很好!但是你能帮我指定一个css规则来减少或增加两个换行符的行距(被&lt;br&gt;替换)吗? @不要恐慌 @CoderDudeTwodee 这确实是一个单独的问题,但是-我不相信您可以设置&lt;br&gt; 的样式,并且如果您修改包含元素的行高,它也会影响文本之间的行。也许您可以改为更改 preg_replace() 以用 &lt;p class='spacer'&gt;&lt;/p&gt; 而不是 \n\n 替换 3+ 换行符,然后通过在 CSS 中使用 .spacer line-height: 1.5;(或其他)来控制这些换行符的高度。有点笨重,但应该可以。【参考方案3】:

简单地说:

$value = preg_replace('/\n\n+/', "\n\n", $value);

也就是说,用一个换行符替换任何超过两个换行符的序列。

【讨论】:

嗯,它绝对“有效”——该代码将用两个或两个以上的\n 字符替换任何系列。如果它没有达到您的预期,您能否发布一个转换前的数据示例以及究竟需要转换什么? 这是新代码-$post= preg_replace('/\n\n+/', "\n\n", $_POST['ab']); echo nl2br($post); 这是输出-john DOE&lt;br /&gt; &lt;br /&gt; john doe&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; &lt;br /&gt; john doe 从该输出看来,换行符之间有空格。 (或者他们可能是CRLF 对?) 我所做的只是在文本区域输入“john doe”并任意按回车并重复三次。 您看到的空格实际上是源代码中的不同行。我不得不将它复制到一行中才能在此处发布。【参考方案4】:

解决办法如下:

$post= preg_replace('/(\n\s*)2,/', '<br>', $_POST['ab']);
echo nl2br($post);

现在的问题是:我为什么要使用那个正则表达式?这是因为 textarea 在每一行之后留下一个空格。为了避免这个问题,我使用了一个额外的\s*。所以 PHP 将来自:

a

b


c

a<br>
<br>b<br>
<br>c

希望有所帮助:)

【讨论】:

是的,它解决了这个问题,但我希望用户能够输出一个带有两个或多个换行符的空行,即,如果我按一次回车,它应该像 &lt;br /&gt;在输出中,但如果我按两次或更多次回车,它应该使用&lt;p&gt; 创建一个新参数。 @PDKnight @CoderDudeTwodee 已编辑。

以上是关于如何使用 php 保留一些限制的空格?的主要内容,如果未能解决你的问题,请参考以下文章

使用Java解析时如何在文档元素之前保留空格?

如何根据限制更改前一些字符的颜色并将其他字符保留在 div 中

如何在Java中仅删除字符串的尾随空格并保留前导空格?

JAVA中如何去除字符串前后的全角空格(当中保留)?

如何获取 <pre> 标记的值并保留所有空格?

如何在仅使用 PHP 发布后保留 textarea 表单值