【问题标题】:Converting line breaks into <li> tags将换行符转换为 <li> 标签
【发布时间】: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']);

标签: php function textarea line-breaks


【解决方案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>';
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-11-12
            • 2012-03-13
            • 1970-01-01
            • 1970-01-01
            • 2013-08-14
            • 2021-11-07
            相关资源
            最近更新 更多