如何用PHP替换部分字符串来创建<li>标签?</li>

时间:2011-03-18 22:45:12

标签: php html

问题非常简单,但解决方案可能不会。

假设这是我在一个名为$ description:

的变量中的文本输入
<p>
text text text
text text text
</p>
<ul>
text text
text text
text text
</ul>
<p>
text text text
text text text
</p>

我相信我需要做的事情已经很明显了。我需要在字符串中找到所有<ul></ul>标记,并在这些条件下为每个条目添加<li></li>标记:

  • 我不知道总共有多少<ul></ul>个标签,该功能应该找到所有这些标签
  • 每个<ul></ul>内的所有列表条目将由输入(\r\n
  • 分隔

有什么想法吗?

4 个答案:

答案 0 :(得分:1)

这听起来像字符串操作的情况:http://www.w3schools.com/php/func_string_str_replace.asp

这是我的5分钟解决方案:

// Replaces \r\n with </li><li>
$description = str_replace("\r\n\","</li><li>",$description);

// Removes the extra <li> that will be left at the end of every <ul>
$description = str_replace("<li></ul>","</ul>",$description);

// Adds an <li> to the start of the <ul> tag.
$description = str_replace("<ul>","<ul><li>",$description);

答案 1 :(得分:1)

如果这是一个如此简单的案例,你就可以逃脱:

$html =
  preg_replace_callback('#(?<=<ul>) [^<]+ (?=</ul>)#x', "li", $html);

function li($match) {
    foreach (explode("\n", trim($match[0])) as $line) {
        $text .= "<li>$line</li>\n";
    }
    return "\n" . $text;
}

(当然,回调函数需要比"li"更好的名称。)

答案 2 :(得分:1)

这将完成这项工作:

  function addLI ($in) {
     $in = str_replace("\r\n", "\n", $in);
     $lines = explode("\n", $in);
     $out = "";
     $ul = false;
     foreach($lines as $line) {
        if ($ul == false) {
           if (stripos($line, "<ul>") !== false) {
              $ul = true;
           }
        }
        else {
           if (stripos($line, "</ul>") !== false) {
              $ul = false;
           }
           else {
              $line = "<li>" . $line . "</li>";
           }
        }
        $out .= $line . "\n";
     }
     return $out;
  }

编辑:第一版仅适用于“\ n” - 现在它适用于“\ n”和“\ r \ n”

答案 3 :(得分:0)

使用DOM你可以做类似的事情:

<?php
    $html = '<p>text text texttext text text</p><ul>text text\r\ntext text\r\ntext text</ul><p>text text texttext text text</p>';
    $document = new DOMDocument();
    $document->loadHTML($html);
    $result = $document->getElementsByTagName('ul');

    foreach ($result as $item)
    {
        $liList = explode('\r\n', $item->textContent);
        $ulContent = '';

        foreach ($liList as $li)
        {
            $ulContent .= '<li>' . $li . '</li>';
        }

        $item->nodeValue = $ulContent;
    }

    echo html_entity_decode($document->saveHTML());