我正在尝试使用给定的字符串生成列表块。我想将以*开头的所有行转换为列表。例如:
Text...
* One
* Two
Other text.
我用php regexp完成了它。
$source=preg_replace("/^\*([^\n]*)/m","<li>$1</li>",$source);
如何才能将所有创建的li组包含在“ul”标签之间?它可能是带有三条“li”线的块,有十条“li”线,依此类推......我试图搜索所有父母,如:
“NOT&lt; / li&gt; +&lt ; li&gt; +(WHATEVER)+&lt; / li&gt; +(NOT&lt; li&gt;)“,但这是不可能的。
答案 0 :(得分:0)
我不确定我是否理解你的问题,但是这个:
$source = preg_replace('/\* ([^\r\n]+)/', '<li>$1</li>', $source);
将变换:
* Test1
* Test2
* Test3
* Test4
分为:
<li>Test1</li>
<li>Test2</li>
<li>Test3</li>
<li>Test4</li>
编辑:
$source = preg_replace('<li>(.+)</li>', '<ul><li>$1</li></ul>', preg_replace('/\* ([^\r\n]+)/', '<li>$1</li>', $source));
...将<li>
包含在<ul>
答案 1 :(得分:0)
您必须匹配连续的<li>...</li>
元素对并将其包装在<ul>
中:
preg_replace('#((?:<li>.*?</li>\s*)+)#', '<ul>\1</ul>', $source);
内部(?: ... )
组匹配一个<li> ... </li>
,可选地后跟空格;这整场比赛至少需要存在一次。
顺便说一下,?:
与任何内容都不匹配,它用于表示不应为周围组分配一个内存插槽用于反向引用。
使用非贪婪的.*?
,这可以匹配<li>
的不同部分,例如
Text...
* One
* Two
Other text.
* Three
* Four
如果您有任何问题,请告诉我。