我想像维基百科一样制作内容列表。我的代码:
<?php
$str = "[H1]Top Heading[/H1] My test string [H2]My sub Heading[/H2] My second [H3]My deep Heading[/H3] string now again [H1]Top Heading[/H1] My test string [H2]My sub Heading[/H2] My second [H3]My deep Heading[/H3]";
/**
* Helper class
*/
class FaqHelper {
static $count = 1;
static $listItems = array();
static $prefix = 'faq-';
static function GetList() {
$items = '';
foreach (self::$listItems as $id => $label) {
$items .= '<li><a href="#' . self::$prefix . $id .'">' . $label . '</a></li>';
}
return '<ul><ol>'. $items .'</ul></ol>';
}
}
// the callback function
function make_faq($matches)
{
$id = FaqHelper::$count;
$label = $matches[1];
FaqHelper::$listItems[$id] = $label;
$res = '<span id="'. FaqHelper::$prefix . $id .'">' . $label . '</span>';
FaqHelper::$count++;
return $res;
}
$text = preg_replace_callback(
"#\[H1\]([^\[]+)\[/H1\]#",
"make_faq",
$str
);
$list = FaqHelper::GetList();
echo $list;
echo '<br /><br />';
echo $text;
?>
,这给了
1. Top Heading
2. Top Heading
Top Heading My test string [H2]My sub Heading[/H2] My second [H3]My deep Heading[/H3] string now again Top Heading My test string [H2]My sub Heading[/H2] My second [H3]My deep Heading[/H3]
但我想要这个结果
1. Top Heading
1.1 My sub Heading
1.1.1 My deep Heading
2. Top Heading
2.1 My sub Heading
2.1.1 My deep Heading
所以...... 顶部标题我的测试字符串我的子标题我的第二个我的深标题字符串现在再次顶部标题我的测试字符串我的子标题我的第二个我的深标题字符串现在再次
基本理论就是这样。
当您点击第一个[H1]时,将计数器增加到1.当您点击h2时,您的第二个水平计数器会增加到1.当您点击h3时,您的第三个水平计数器会增加到1. / p>
这显然会输出1.1.1。
现在当你点击下一个h1时,它们的子级别(即不是主级别)被重置为0,然后第一级别增加到2.你点击h2,它再次变为1 ......然后你有第一级第2级,第1级,第1级= 2.1.1。
答案 0 :(得分:0)
请注意,此代码仅支持3个级别的标题。我知道这个解决方案无法无限扩展,也不支持递归解析,但遗憾的是我没有时间为SO问题创建完美的解决方案。
我的扩展解决方案基于您的上一个问题如下。请测试它,看它是否按预期工作。请注意,我已经使区分大小写与[H1] [/ H1]标签匹配,因此[h1] [/ h1]现在也可以正常工作。
我再次道歉,如果我很慢或者结果不完美但是我不能完成你的整个项目,你需要自己做一些研究,学习然后再做。此外,随着代码的发展和变厚,需要更多的时间来进一步扩展和维护它,我并不总是有能力做到这一点。
享受!
<?php
$str = "
[h1]Header 1[/h1]Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam vitae rutrum tellus. Vestibulum nec nisl eu enim venenatis ornare. Suspendisse a nunc nibh, quis placerat urna. Pellentesque nec odio est. [h2]Header 2[/h2]Morbi et orci non nulla lobortis convallis. Curabitur vestibulum, felis auctor posuere posuere, mauris neque vulputate tellus, vel luctus urna sapien vitae sapien. [h2]Header 2-2[/h2] Integer accumsan lobortis euismod. Integer vitae tempor nisl.
[h1]Header 1[/h1]Mauris varius dolor nec risus viverra egestas. Suspendisse potenti. Nunc consectetur faucibus metus, nec sagittis felis pellentesque non. Ut mattis ligula non [h2]Header 2[/h2] purus vehicula sed tempus risus porttitor. Nullam eget arcu[h3]Header 3[/h3] at mi pulvinar pellentesque eu sed ipsum. Fusce vel laoreet sem. Duis hendrerit ligula iaculis felis hendrerit euismod vel ut mauris. Pellentesque tempus velit et velit cursus sodales. Sed adipiscing vulputate nibh sed venenatis. Quisque sit amet ante velit. Donec dui lectus, ultricies quis interdum eget, elementum vitae nibh. Nullam nec sapien purus, laoreet porta elit. Nam luctus elit sit amet est ultricies eget varius diam ullamcorper. Sed commodo viverra lobortis. Vivamus semper blandit arcu semper pellentesque. Duis interdum tincidunt nisl eget mollis.
[h1]Header 1[/h1]Suspendisse laoreet, tortor sed viverra pellentesque, enim felis tempus ante, sit amet dignissim leo augue non ipsum. Ut eu risus erat. Donec pellentesque ligula ac est tincidunt ullamcorper. [h2]My paragraph again[/h2] Pellentesque eget diam lacus, nec ornare urna. Nulla a interdum augue. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce et justo turpis. ";
class FaqHeading
{
var $heading_level;
var $id;
var $label;
var $children = array();
var $parent = null;
function __construct($heading_level, $id, $label)
{
$this->heading_level = (int) $heading_level;
$this->id = (int) $id;
$this->label = $label;
}
function AddChild(FaqHeading $child)
{
if ($child->heading_level <= $this->heading_level) {
return; // cannot add higher or equal leveld headings as children
}
$child->parent = $this;
$this->children[] = $child;
}
function HasChildren()
{
return (bool) $this->children;
}
}
class FaqHeadingList
{
var $headings = array();
var $current = null;
var $prefix;
function __construct($prefix)
{
$this->prefix = $prefix;
}
function AddHeading($heading_level, $id, $label)
{
$elem = new FaqHeading($heading_level, $id, $label);
if ($this->current == null || $heading_level == 1) {
$this->headings[] = $elem;
} else if ($heading_level == 2 && ($this->current->heading_level == 1)) {
$this->current->AddChild($elem);
} else if ($heading_level == 2 && ($this->current->heading_level == 2)) {
$this->current->parent->AddChild($elem);
} else if ($heading_level == 2 && ($this->current->heading_level == 3)) {
$this->current->parent->parent->AddChild($elem);
} else if ($heading_level == 3 && ($this->current->heading_level == 1)) {
$this->current->AddChild($elem);
} else if ($heading_level == 3 && ($this->current->heading_level == 2)) {
$this->current->AddChild($elem);
} else if ($heading_level == 3 && ($this->current->heading_level == 3)) {
$this->current->parent->AddChild($elem);
}
$this->current = $elem;
}
function ToString()
{
$str = '<ol>';
foreach ($this->headings as $h1)
{
if ($h1->heading_level == 1)
{
$str .= '<li>'. $this->CreateLink($h1->id, $h1->label);
if ($h1->hasChildren())
{
$str .= '<ol>';
foreach ($h1->children as $h2)
{
$str .= '<li>' . $this->CreateLink($h2->id, $h2->label);
if ($h2->hasChildren())
{
$str .= '<ol>';
foreach ($h2->children as $h3)
{
$str .= '<li>'. $this->CreateLink($h3->id, $h3->label) .'</li>';
}
$str .= '</ol>';
}
$str .= '</li>';
}
$str .= '</ol>';
}
$str .= '</li>';
}
}
$str .= '</ol>';
return $str;
}
function CreateLink($id, $label)
{
return '<a href="#' . $this->prefix . $id .'">' . $label . '</a>';
}
}
/**
* Helper class
*/
class FaqHelper
{
static $count = 1;
static $headingList;
static $prefix = 'faq-';
static function Init()
{
self::$headingList = new FaqHeadingList(self::$prefix);
}
static function ReplaceCallback($matches)
{
$id = self::$count;
$heading_level = $matches[1];
$label = $matches[2];
self::$headingList->AddHeading($heading_level, $id, $label);
$res = '<span id="'. self::$prefix . $id .'">' . $label . '</span>';
self::$count++;
return $res;
}
}
FaqHelper::init();
$text = preg_replace_callback(
"#\[H([0-9]+)\]([^\[]+)\[/H\\1\]#i",
array('FaqHelper', "ReplaceCallback"),
$str
);
$list = FaqHelper::$headingList->ToString();
echo $list;
echo '<br /><br />';
echo nl2br($text);
?>
应输出:
1. Header 1
1. Header 2
2. Header 2-2
2. Header 1
1. Header 2
1. Header 3
3. Header 1
1. My paragraph again
Header 1Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam vitae rutrum tellus. Vestibulum nec nisl eu enim venenatis ornare. Suspendisse a nunc nibh, quis placerat urna. Pellentesque nec odio est. Header 2Morbi et orci non nulla lobortis convallis. Curabitur vestibulum, felis auctor posuere posuere, mauris neque vulputate tellus, vel luctus urna sapien vitae sapien. Header 2-2 Integer accumsan lobortis euismod. Integer vitae tempor nisl.
Header 1Mauris varius dolor nec risus viverra egestas. Suspendisse potenti. Nunc consectetur faucibus metus, nec sagittis felis pellentesque non. Ut mattis ligula non Header 2 purus vehicula sed tempus risus porttitor. Nullam eget arcuHeader 3 at mi pulvinar pellentesque eu sed ipsum. Fusce vel laoreet sem. Duis hendrerit ligula iaculis felis hendrerit euismod vel ut mauris. Pellentesque tempus velit et velit cursus sodales. Sed adipiscing vulputate nibh sed venenatis. Quisque sit amet ante velit. Donec dui lectus, ultricies quis interdum eget, elementum vitae nibh. Nullam nec sapien purus, laoreet porta elit. Nam luctus elit sit amet est ultricies eget varius diam ullamcorper. Sed commodo viverra lobortis. Vivamus semper blandit arcu semper pellentesque. Duis interdum tincidunt nisl eget mollis.
Header 1Suspendisse laoreet, tortor sed viverra pellentesque, enim felis tempus ante, sit amet dignissim leo augue non ipsum. Ut eu risus erat. Donec pellentesque ligula ac est tincidunt ullamcorper. My paragraph again Pellentesque eget diam lacus, nec ornare urna. Nulla a interdum augue. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce et justo turpis.