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

时间:2016-03-23 21:37:05

标签: php html-formatting

As I pressed enter 3 times, three <br> were created resulting in three white spaces我正在尝试构建一个人们编写并将其发布到数据库的站点。文本用<textarea>编写,我想将空格保留为格式化。

例如,用户必须按ENTER才能从当前输入的新行中获取新行,之后,如果他们想通过不写任何内容再次按ENTER,则表示将有两个新行,我想保留两个或两个以上的新行仅限于一个空白行。

Stackoverflow有这个功能,在写这行时,我从最后一行按三次输入,但你只能看到一个空格。

我如何用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>

查看<br />创建的nl2br,我希望连续的<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>

4 个答案:

答案 0 :(得分: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>

答案 1 :(得分:1)

您可能在Windows上,换行符为\r\n,而不是\n,与其他系统一样。事实上,根据this answer浏览器,我们应该始终将新行从textareas规范化为\r\n。也许这就是问题所在。

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

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

要将2个或更多新行折叠为正确关闭的<p>,就像在示例输出中一样,有点困难,我不确定你能否可靠地执行它,因为它依赖于用户创建2个换行符以指示<p>的开头,并为结束创建另外2个换行符。如果他们没有包含2个结束换行符,那么你的正则表达式没有结束标记,它将无法匹配。我认为更安全地坚持2 <br>

顺便说一下,&#34;空白&#34;表示任何空格字符,包括空格,制表符和换行符; &#34;空格&#34;指连续单词之间的空格; &#34;换行符&#34;换行符。你的问题混淆了并交换了这些术语,并且在前几次阅读中很难理解。

答案 2 :(得分:0)

简单地说:

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

也就是说,只用一个替换两个以上换行符的任何序列。

答案 3 :(得分:0)

以下是解决方案:

$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

希望有所帮助:)