我正在创建一个上传表单,其中包含一个文本区域供用户输入烹饪食谱。基本上,我想要做的是将每一行包装在<li>
标记中以用于输出目的。我一直试图操纵nl2br
功能,但无济于事。有人可以帮忙吗?
我正在通过POST检索文本区域的内容并将条目存储在MySQL数据库中。
这是代码目前的样子(check_input
函数条带斜线等):
$prepText=check_input($_POST['preparationText']);
$cookText=check_input($_POST['cookingText']);
答案 0 :(得分:8)
不太漂亮,但想到的一个想法是:
</li><li>
内爆数组:可以翻译成这样的东西:
$new_string = '<li>' . implode('</li><li>', explode("\n", $old_string)) . '</li>';
(是的,糟糕的主意 - 不要这样做,特别是如果文字很长的话)
另一种更清洁的解决方案是替换字符串中的换行符</li><li>
:
(将结果字符串包装在<li>
和</li>
中,以打开/关闭这些字符串)
$new_string = '<li>' . str_replace("\n", '</li><li>', $old_string) . '</li>';
有了这个想法,例如,以下部分代码:
$old_string = <<<STR
this is
an example
of a
string
STR;
$new_string = '<li>' . str_replace("\n", '</li><li>', $old_string) . '</li>';
var_dump($new_string);
会得到这种输出:
string '<li>this is</li><li>an example</li><li>of a </li><li>string</li>' (length=64)
答案 1 :(得分:7)
按\n
分解字符串,然后将每行包装在li
标记中。
<?php
$string = "line 1\nline 2\nline3";
$bits = explode("\n", $string);
$newstring = "<ol>";
foreach($bits as $bit)
{
$newstring .= "<li>" . $bit . "</li>";
}
$newstring .= "</ol>";
答案 2 :(得分:2)
我根据理查德的答案创建了一个函数,以防它节省任何时间!
/**
* @param string $str - String containing line breaks
* @param string $tag - ul or ol
* @param string $class - classes to add if required
*/
function nl2list($str, $tag = 'ul', $class = '')
{
$bits = explode("\n", $str);
$class_string = $class ? ' class="' . $class . '"' : false;
$newstring = '<' . $tag . $class_string . '>';
foreach ($bits as $bit) {
$newstring .= "<li>" . $bit . "</li>";
}
return $newstring . '</' . $tag . '>';
}
答案 3 :(得分:1)
function nl2li($str)
{
if (!isset($str)) return false;
$arr = explode("\r\n", $str);
$li = array_map(function($s){ return '<li>'.$s.'</li>'; }, $arr);
return '<ul>'.implode($li).'</ul>';
}
输入:
Line 1\r\nLine2\r\nLine3\r\n
输出:
<ul><li>Line 1</li><li>Line 2</li><li>Line 3</li></ul>
答案 4 :(得分:0)
最简单的方法:
function ln2ul($string) {
return '<ul><li>' . str_replace("\n", '</li><li>', trim($string)) . '</li></ul>';
}