PHP 格式化列表项
Posted
技术标签:
【中文标题】PHP 格式化列表项【英文标题】:PHP formatting list items 【发布时间】:2011-05-29 23:41:52 【问题描述】:我想将以下文本转换为列表项
* Item 1
* Item 2
- item 1
- item 2
到
<ul>
<li>Item 1</li>
<li>Item 2</li>
</ul>
我做了以下正则表达式,这还不够好
$text = preg_replace('#(*\s[*.]\s*)#','<li>$0</li>', $text);
但这不起作用。我不擅长做RE。
我在这里把问题说得更清楚。
文本可能包含项目符号,也可能不包含项目符号,我无法按照 atno 的建议循环浏览文件。
这里是示例
* html *SEO * javascript * php
- HTML
- SEO
-Javascript
-PHP
-HTML - SEO -Javascript -PHP
【问题讨论】:
数据库中没有文本。它的用户输入了文本。 你想创建一个像 *** 和 github 使用的 markdown 系统吗? 为什么不支持完整的标记语言,比如 Markdown,让解析器为您完成这项工作? @jason 向我们展示更多代码,您从数据库中检索的文本是什么样的 @atno:这并不重要。您需要知道的所有信息都在问题中。 【参考方案1】:所以也许是这样的:
<?PHP
$text = <<<Text
* HTML *SEO * Javascript * PHP
- HTML
- SEO
-Javascript
-PHP
-HTML - SEO -Javascript -PHP
Text;
$text = preg_replace('/(\*|-)\s*([\S]+)\s*/',"<li>$2</li>\n",$text);
print $text;
?>
输出如下:
<li>HTML</li>
<li>SEO</li>
<li>Javascript</li>
<li>PHP</li>
<li>HTML</li>
<li>SEO</li>
<li>Javascript</li>
<li>PHP</li>
<li>HTML</li>
<li>SEO</li>
<li>Javascript</li>
<li>PHP</li>
【讨论】:
+1 给你,我正要粘贴我的解决方案,但我没有使用 preg_replace,因为我不熟悉 我们还需要整理一下 @jason,你想把 放在哪里,我以为它们只是在开头和结尾! 这些列表项可以在文本中的任何位置,也可能根本不在【参考方案2】:使用正则表达式有点讨厌,但你可以这样做:
<?php
$text = <<<TEXT
* HTML *SEO * Javascript * PHP
- HTML
- SEO
-Javascript
-PHP
-HTML - SEO -Javascript -PHP
TEXT;
$text = preg_replace_callback('`([*-]\s*([^*-\r\n]+)(\r?\n)?)+`', function($m)
$str = '<ul>';
$str .= preg_replace('`[*-]\s*([^*-\r\n]+)\s*`', '<li>$1</li>', $m[0]);
$str .= '</ul>';
return $str;
, $text);
echo $text;
我得到这个作为输出:
*snip* 澄清更改输出
【讨论】:
这是最好的解决方案,但我仍在努力使其完美。我试图仅转换那些不止一个的列表项,例如 *a *b - c *d - e * f * g 在这种情况下,a 和 b 将被转换为列表项,并且仅 f 和 g。我写了以下 RE #(*\s*([^*\r\n]+)([*\r\n*]))# 这工作正常,但它不适用于最后一项说 g。跨度> 哦,我假设您不想混合列表类型。我故意这样做是为了将它们转换为单独的列表,并且中间的空白行也会结束列表。应该能够将\*
替换为[*-]
而不是在第一个块中(它在那里两次),然后废弃第二部分。这里..我会编辑,但不能在这里测试【参考方案3】:
好吧,这是我能想到的最好的,但它解决了部分问题,也许其他人可以找到更好的
// first i remove the spaces after the hyphen, like in '- SEO' to have some consistency
$str = str_replace ('- ','-', $str);
// then i look for hyphen-word-new line and replace it with the format i want.
$list = preg_replace('#\-(.*)\n#',"<li>$1</li>\n", $str);
显然这并不完全正确,因为您仍然需要<ul>
标记。祝你好运!
【讨论】:
以上是关于PHP 格式化列表项的主要内容,如果未能解决你的问题,请参考以下文章