2

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

Text...
* One
* Two
Other text.

我已经用 php 正则表达式完成了它。

$source=preg_replace("/^\*([^\n]*)/m","<li>$1</li>",$source);

我怎样才能让它在“ul”标签之间包含所有创建的 li 组?它可能是带有三个“li”行的块,有十个“li”行,依此类推......我试图搜索所有父母,如:
“NOT < /li > + < li > + (WHATEVER) + < / li > + (NOT < li >)",但这是不可能的。

4

2 回答 2

0

您必须匹配连续的<li>...</li>元素对并将它们包装在<ul>

preg_replace('#((?:<li>.*?</li>\s*)+)#', '<ul>\1</ul>', $source);

内部(?: ... )组匹配一个<li> ... </li>,可选地后跟空格;整个匹配项至少需要存在一次。

顺便说一句,?:不匹配任何东西,它用于指示不应该为周围的组分配内存插槽用于反向引用。

通过使用非贪婪.*?,这可以匹配 's 的单独部分<li>,例如

Text...
* One
* Two
Other text.
* Three
* Four

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

于 2012-06-15T16:14:53.160 回答
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>s 中的<ul>

于 2012-06-15T15:28:45.710 回答