在PHP中将文本列表转换为html的正则表达式
我正在尝试编写一个regexp以转换文本块:在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等),但我认为这太过分了:我真的只想要一些基本的功
* 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);