附上一个小组(可能有几个)

时间:2012-06-15 15:22:45

标签: php regex

我正在尝试使用给定的字符串生成列表块。我想将以*开头的所有行转换为列表。例如:

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;)“,但这是不可能的。

2 个答案:

答案 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

如果您有任何问题,请告诉我。