将换行符转换为 <li> 标签
Posted
技术标签:
【中文标题】将换行符转换为 <li> 标签【英文标题】:Converting line breaks into <li> tags 【发布时间】:2011-07-21 06:44:12 【问题描述】:我正在创建一个上传表单,其中有一个文本区域供用户输入烹饪食谱。本质上,我想做的是将每一行包装在 <li>
标记中以用于输出目的。我一直在尝试操纵nl2br
函数,但无济于事。有人可以帮忙吗?
我正在通过 POST 检索文本区域的内容并将条目存储在 mysql 数据库中。
下面是代码目前的样子(check_input
函数去除斜杠等):
$prepText=check_input($_POST['preparationText']);
$cookText=check_input($_POST['cookingText']);
【问题讨论】:
您的数据来自哪里?它是如何存储的?等等……你想让我们猜到这一切吗? 对不起,我意识到我没有给你任何工作。我正在通过 POST 检索 textarea 内容并将它们存储在 MySQL 数据库中。这是目前代码的样子(check_input 函数去除斜线等): $prepText=check_input($_POST['preparationText']); $cookText=check_input($_POST['cookingText']); 【参考方案1】:用\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】:不是很漂亮,但想到的一个想法是:
分解字符串,使用换行符作为分隔符 并内爆数组,在项目之间使用</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)
【讨论】:
【参考方案3】:我根据 Richard 的回答创建了一个函数,以防它为任何人节省一些时间!
/**
* @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 . '>';
【讨论】:
【参考方案4】: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>
【讨论】:
【参考方案5】:最简单的方法:
function ln2ul($string)
return '<ul><li>' . str_replace("\n", '</li><li>', trim($string)) . '</li></ul>';
【讨论】:
以上是关于将换行符转换为 <li> 标签的主要内容,如果未能解决你的问题,请参考以下文章