如何使用 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
创建的<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>
【问题讨论】:
您想在人们在文本区域中输入时阻止它,或者只是在提交表单后清理多行空白? 我想在提交后清理多行换行符。 这个答案应该会有所帮助:***.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" . '<p>$1</p>', $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 个或更多换行符以正确关闭 <p>
s,就像您在示例输出中所做的那样,有点困难,我不确定您能否可靠地做到这一点,因为它依赖于用户创建 2 个换行符指示<p>
的开始和结束的另外2 个换行符。如果它们不包含 2 个结束换行符,则您的正则表达式没有结束标记,它将无法匹配。我认为坚持使用 2 <br>
s 更安全。
顺便说一句,“空白”是指任何空格字符,包括空格、制表符和换行符; “空格”是指连续单词之间的空格; “换行符”表示换行符。您的问题混淆并互换了这些术语,在最初的几次阅读中很难理解。
【讨论】:
效果很好!但是你能帮我指定一个css规则来减少或增加两个换行符的行距(被<br>
替换)吗? @不要恐慌
@CoderDudeTwodee 这确实是一个单独的问题,但是-我不相信您可以设置<br>
的样式,并且如果您修改包含元素的行高,它也会影响文本之间的行。也许您可以改为更改 preg_replace() 以用 <p class='spacer'></p>
而不是 \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<br /> <br /> john doe<br /> <br /> <br /> <br /> 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
希望有所帮助:)
【讨论】:
是的,它解决了这个问题,但我希望用户能够输出一个带有两个或多个换行符的空行,即,如果我按一次回车,它应该像<br />
在输出中,但如果我按两次或更多次回车,它应该使用<p>
创建一个新参数。 @PDKnight
@CoderDudeTwodee 已编辑。以上是关于如何使用 php 保留一些限制的空格?的主要内容,如果未能解决你的问题,请参考以下文章