如何在php中保留空格并满足一些限制条件?

3

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

例如,用户必须按下 ENTER 才能从他们正在输入的当前行跳转到新行,在此之后,如果他们想通过什么都不写来再次按下 ENTER,那么就意味着会有两个换行符,我想将两个或多个换行符限制为只有一个空行。

Stack Overflow 有这个功能,当我写这行代码时,我从上一行按了三次 enter ,但您只能看到一个空格。

As I pressed enter 3 times, three <br> were created resulting in three white spaces

我如何用 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 创建的 <br />,我希望连续的 <br /r> 变成 <p>...</p>

这是我想要的输出 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>

我想在提交后清理多行间断。 - user5831063
这个答案应该会有帮助:https://dev59.com/IlHTa4cB1Zd3GeqPSIAt - user1189882
@maxhb,请查看我问题中的HTML源代码输出。 - user5831063
@maxhb 这就是我所拥有的全部源代码。只需运行第一个并进行验证。 - user5831063
rtrim($textarea); 会移除文本框中的尾部空格。 - Ryan Vincent
显示剩余4条评论
4个回答

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 - user5831063
尝试像这样做:$input=$_POST['ab']; $output = preg_replace('/\n\n+([^\n]+)/', "\n" . '<p>$1</p>', $input); echo nl2br($output); 因为你直接将\n带入字符串中,所以它可以工作,但在此方法中对于textarea则无法工作。@maxhb - user5831063

1
你可能在使用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);

要将两个或更多的换行符折叠成正确闭合的<p>,就像你在示例输出中所做的那样,有点困难,我不确定您能否可靠地完成它,因为它依赖于用户创建2个换行符来表示<p>的开始,以及另外2个换行符来表示结尾。如果他们没有包括这2个结束换行符,您的正则表达式就没有结束标记,无法匹配。我认为更安全的做法是坚持使用2个<br>
顺便说一下,“空白”意味着任何空格字符,包括空格、制表符和换行符;“空格”指单词之间的空格;“换行符”指换行符。您的问题混淆并交换了这些术语,使得在前几次阅读时很难理解。

非常好!但是你能帮我指定一个CSS规则来调整两个换行符(被替换为<br>)时的行间距吗?@don'tpanic - twodee
@CoderDudeTwodee 这其实是一个不同的问题,但我认为你不能给<br>添加样式,如果你修改包含元素的行高,它也会影响文本之间的行。也许你可以改变preg_replace()函数,用<p class='spacer'></p>替换3个以上的换行符\n\n,然后通过在CSS中设置.spacer {line-height: 1.5;}(或其他值)来控制这些段落的高度。有点笨拙,但应该能行。 - Don't Panic

0

简单点怎么样:

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

也就是说,将超过两个换行符的连续序列替换为一个。


它肯定是“有效的” - 该代码将用两个字符替换任何两个或更多\n字符的系列。如果它没有做你期望的事情,你能否发布转换之前的数据示例以及需要转换的确切内容? - VoteyDisciple
这是新代码- $post= preg_replace('/\n\n+/', "\n\n", $_POST['ab']); echo nl2br($post); 这是输出-john DOE<br /> <br /> john doe<br /> <br /> <br /> <br /> john doe - user5831063
从输出结果来看,似乎在换行符之间有空格。(或者它们是CRLF对吗?) - VoteyDisciple
我所做的只是在文本区域中输入“John Doe”,随意按下回车键,然后重复三次。 - user5831063
你看到的空格实际上是源代码中的不同行。我不得不将其复制成一行才能在这里发布。 - user5831063

0

这是解决方案:

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

现在的问题是:为什么我要使用那个正则表达式?因为文本区域在每行后面都会留下一个空格。为了避免这个问题,我使用了额外的\s*。所以PHP将从以下内容开始:
a

b


c

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

希望有所帮助 :)

是的,它可以解决这个问题,但我希望用户能够在输出中生成一个空行,并包含两个或更多的换行符。也就是说,如果我按一次回车键,它应该在输出中作为 <br /> 运行,但是如果我按两次或更多次回车键,它应该生成一个新的段落 <p>。@PDKnight - twodee
@CoderDudeTwodee 已编辑。 - PDKnight

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接