我正在尝试构建一个人们编写并将其发布到数据库的站点。文本用<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>
答案 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
希望有所帮助:)