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);

显然这并不完全正确,因为您仍然需要&lt;ul&gt; 标记。祝你好运!

【讨论】:

以上是关于PHP 格式化列表项的主要内容,如果未能解决你的问题,请参考以下文章

PHP脚本循环遍历目录中的所有文件?

mac如何格式化移动硬盘?

php 以$ _POST格式获取多维数组并转换为无序列表。

PHP 邮件列表 - 没有数据库,只有flatfile - CSV格式

使用R创建动态列表以在闪亮中使用它

如何在 php 中格式化多维数组上的数字?