【问题标题】:PHP formatting list itemsPHP 格式化列表项
【发布时间】:2026-02-21 02:10:01
【问题描述】:

我想将以下文本转换为列表项

* 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:这并不重要。您需要知道的所有信息都在问题中。

标签: php text-formatting


【解决方案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; 标记。祝你好运!

    【讨论】: