问题非常简单,但解决方案可能不会。
假设这是我在一个名为$ 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
)有什么想法吗?
答案 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());