在PHP中将文本列表转换为html的正则表达式

在PHP中将文本列表转换为html的正则表达式,php,html,regex,Php,Html,Regex,我正在尝试编写一个regexp以转换文本块: * List item * Another list item 要使用html,请执行以下操作: <ul> <li>List item</li> <li>Another list item</li> </ul> 列表项 另一个列表项 我知道有一些代码片段或类可以做到这一点(Markdown、Textile等),但我认为这太过分了:我真的只想要一些基本的功

我正在尝试编写一个regexp以转换文本块:

* List item
* Another list item
要使用html,请执行以下操作:

<ul>
    <li>List item</li>
    <li>Another list item</li>
</ul>
  • 列表项
  • 另一个列表项
我知道有一些代码片段或类可以做到这一点(Markdown、Textile等),但我认为这太过分了:我真的只想要一些基本的功能。到目前为止,我正在尝试:

$text = preg_replace("/\*+(.*)?/i","<li>$1</li>",$text);
$text=preg\u replace(“/\*+(.*))/i”,“
  • $1
  • ”,$text);
    但我不知道如何在不使用单独替换的情况下将所有内容包装在
      标签中,例如:

      $text = preg_replace("/(\<li\>(.*)\<\/li\>\n*)+/is","<ul>\n$1\n</ul>\n",$text);
      
      $text=preg\u replace(“/(\(.*)\\n*)+/is“,”
        \n$1\n
      \n“,$text);
      这会干扰其他代码,例如有序列表。一定有更好的办法


      谢谢。

      好吧,你可以简单地做

      $text = "<ul>" . preg_replace("/\*+(.*)?/i","<li>$1</li>",$text) . "</ul>";
      

      为什么不使用preg_match_all将第一个正则表达式存储在一个数组中,并将其粘合如下:

      $list='<ul><li>';
      $list .= implode('</li><li>',$arr_regex);
      $list .= '</li></ul>';
      
      $list='
      • ”; $list.=内爆(“
      • ”,$arr_regex); $list.='
      ';
      也许你会觉得有用。

      在这个问题上,如果你谈论这样一个事实,即你使用的代码会将多组li标签包装在一个ul标签中,即使假设有这样的中断:

      * line 1
      * line 1
      * line 1
      this is not part of a list
      * line 1
      * line 1
      * line 1
      
      将成为:

      <ul>
      <li>line 1</li>
      <li>line 1</li>
      <li>line 1</li>
      this is not part a the list
      <li>line 1</li>
      <li>line 1</li>
      </ul>
      
      • 第1行
      • 第1行
      • 第1行
      • 这不是清单的a部分
      • 第1行
      • 第1行
      那我给你一个解决办法。你那里有90%的问题,下面是我提出的解决方案(但我相信你已经解决了):

      $text=preg\u replace(“/\*+(.*))/i”,“
      • $1
        • ”,$text); $text=preg\u replace(“/(\\n(.*)\*)+/”,“”,$text);

      该解决方案不会弄乱文本或其他页面上已经存在的任何类型的列表,并确保将多个列表分开。原因是,它找到的每一个匹配项都是使用星号创建文本列表项,它围绕着ul和li,然后第二行找到所有背对背的关闭和打开ul标记,并将它们删除。

      如果文本是文本块中的唯一元素,这将起作用,但前后都有内容。同样,也许我没有说清楚(对不起),但是$text中有更多的东西,所以添加
        是不起作用的。老实说,我是在试图避免使用它。只需要几个替代品。我的脚本大约是10Kb。包括一个40Kb的脚本来做这件事似乎有些过分了。这真是太巧妙了!这将解决问题。非常感谢。我会给它一个RealWorks®自旋,看看它是如何工作的。当正则表达式出现在短语的中间时,上面的正则表达式会产生问题。如果遇到该问题,则可以修改正则表达式,使其仅在行首处匹配*:preg_replace(“/^*+(.*))/im”,“
        • <1
          • ”,$text);
            <ul>
            <li>line 1</li>
            <li>line 1</li>
            <li>line 1</li>
            this is not part a the list
            <li>line 1</li>
            <li>line 1</li>
            </ul>
            
            $text = preg_replace("/\*+(.*)?/i","<ul><li>$1</li></ul>",$text);
            $text = preg_replace("/(\<\/ul\>\n(.*)\<ul\>*)+/","",$text);