Преобразование разрывов строк в теги <li> - PullRequest
8 голосов
/ 23 марта 2011

Я создаю форму загрузки, в которой есть текстовая область, чтобы пользователи могли вводить рецепты приготовления. По сути, я хочу заключить каждую строку в тег <li> для целей вывода. Я пытался манипулировать функцией nl2br, но безрезультатно. Кто-нибудь может помочь?

Я извлекаю содержимое текстовой области через POST и сохраняю записи в базе данных MySQL. Вот как выглядит код на данный момент (функция check_input удаляет косую черту и т. Д.):

$prepText=check_input($_POST['preparationText']);    
$cookText=check_input($_POST['cookingText']); 

Ответы [ 5 ]

8 голосов
/ 23 марта 2011

Разбейте строку на \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>";
8 голосов
/ 23 марта 2011

Не совсем красиво, но идея, которая приходит на ум, заключается в следующем:

  • взорвать строку, используя newline в качестве разделителя
  • и взорвать массив, используя </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)
2 голосов
/ 06 июля 2015

Я создал функцию, основанную на ответе Ричарда, на случай, если она кого-нибудь сэкономит!

/**
 * @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 . '>';
}
1 голос
/ 04 января 2017
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>
0 голосов
/ 16 ноября 2017

Самый простой способ сделать это:

function ln2ul($string) {
  return '<ul><li>' . str_replace("\n", '</li><li>', trim($string)) . '</li></ul>';
}
...