在 PHP 中将文本列表转换为 html 的正则表达式
Posted
技术标签:
【中文标题】在 PHP 中将文本列表转换为 html 的正则表达式【英文标题】:A regex that converts text lists to html in PHP 【发布时间】:2011-01-21 14:54:39 【问题描述】:我正在尝试编写一个正则表达式来转换一段文本:
* List item
* Another list item
到html:
<ul>
<li>List item</li>
<li>Another list item</li>
</ul>
我知道有 sn-ps 或类可以做到这一点(Markdown、Textile 等),但我认为这太过分了:我真的只想要一些基本功能。到目前为止,我正在尝试:
$text = preg_replace("/\*+(.*)?/i","<li>$1</li>",$text);
但我不知道如何在不使用单独替换的情况下将所有内容包装在
标签中,如下所示:$text = preg_replace("/(\<li\>(.*)\<\/li\>\n*)+/is","<ul>\n$1\n</ul>\n",$text);
这会干扰其他代码,例如有序列表。一定有更好的办法。
谢谢。
【问题讨论】:
【参考方案1】:在这个问题上,如果你说你使用的代码会将多组 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>
那么我有一个解决方案给你。你有 90% 的问题,这是我想出的一个解决方案(但我相信你已经解决了):
$text = preg_replace("/\*+(.*)?/i","<ul><li>$1</li></ul>",$text);
$text = preg_replace("/(\<\/ul\>\n(.*)\<ul\>*)+/","",$text);
该解决方案不会与文本中页面上已有的任何类型的列表或其他内容混淆,并确保分隔多个列表。原因是它找到的每个匹配项都使用星号创建一个文本列表项,它用 ul 和 li 包围它,然后第二行找到所有背靠背的关闭和打开 ul 标记并将它们删除。
【讨论】:
这很巧妙!它会解决问题。谢谢你。我会给它一个 RealWorld® 旋转,看看它是如何工作的。 当 * 出现在短语中间时,上面的正则表达式会出现问题。如果遇到该问题,则可以修改正则表达式以仅在 * 位于行首时匹配: preg_replace("/^*+(.*)?/im","$1 ",$text);【参考方案2】:也许你会发现php Markdown 很有用。
【讨论】:
老实说,有点试图避免使用它。只需要几个替换。我的脚本大约 10Kb。包括一个 40Kb 的脚本只是为了做到这一点似乎有点过头了。【参考方案3】:为什么不使用 preg_match_all 将第一个正则表达式存储在一个数组中,然后像这样粘合它:
$list='<ul><li>';
$list .= implode('</li><li>',$arr_regex);
$list .= '</li></ul>';
【讨论】:
如果文本是文本块中唯一的元素,这将起作用,但前后都有。【参考方案4】:嗯,你可以这样做
$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);
【讨论】:
再说一次,可能我没说清楚(抱歉),但是$text里面的东西比较多,所以添加是行不通的。以上是关于在 PHP 中将文本列表转换为 html 的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 PHP 在 MySQL 数据库中将纯文本 CSV 字段保存为 HTML?