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

时间:2010-02-26 20:21:01

标签: php html regex

我正在尝试编写正则表达式来转换文本块:

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

但我不知道如何在&lt; ul&gt;中包装所有内容不使用单独替换的标签,如下所示:

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

这会干扰其他代码,例如有序列表。必须有更好的方法。

感谢。

4 个答案:

答案 0 :(得分:13)

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

* 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>

然后我有一个解决方案给你。你有90%的,这是我提出的解决方案(但我相信你已经解决了它):

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

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

答案 1 :(得分:1)

为什么不将第一个正则表达式存储在带有preg_match_all的数组中,并将其粘贴如下:

$list='<ul><li>';
$list .= implode('</li><li>',$arr_regex);
$list .= '</li></ul>';

答案 2 :(得分:0)

嗯,你可以简单地做

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

或者,如果您真的想使用preg_replace

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

答案 3 :(得分:0)

也许您可能会发现PHP Markdown有用。

相关问题