将换行符转换为 <li> 标签

Posted

技术标签:

【中文标题】将换行符转换为 <li> 标签【英文标题】:Converting line breaks into <li> tags 【发布时间】:2011-07-21 06:44:12 【问题描述】:

我正在创建一个上传表单,其中有一个文本区域供用户输入烹饪食谱。本质上,我想做的是将每一行包装在 &lt;li&gt; 标记中以用于输出目的。我一直在尝试操纵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】:

不是很漂亮,但想到的一个想法是:

分解字符串,使用换行符作为分隔符 并内爆数组,在项目之间使用&lt;/li&gt;&lt;li&gt;

可以翻译成这样的:

$new_string = '<li>' . implode('</li><li>', explode("\n", $old_string)) . '</li>';

(是的,坏主意 - 不要那样做,尤其是在文本很长的情况下)

另一种更简洁的解决方案是 将字符串中的换行符替换为 &lt;/li&gt;&lt;li&gt;(将生成的字符串包装在 &lt;li&gt;&lt;/li&gt; 中,以打开/关闭它们)

$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> 标签的主要内容,如果未能解决你的问题,请参考以下文章

sql查询将换行符转换为html <br>

去除li标签自动换行

将 JSON \n 转换为 HTML <br> 标签

css将列表以行内块显示时怎么把他们之间的间隙去掉?在<li>标签上设置margin:0也没有用

如何在预填充的文本区域中将 <br /> 转换为换行符

DIV+CSS样式,li自动适应高度,自动换行,横向排列