2

这是我到目前为止所拥有的:

<?php
$text = preg_replace('/((\*) (.*?)\n)+/', 'awesome_code_goes_here', $text);
?>

我成功匹配以下格式的纯文本列表:

* list item 1
* list item 2

我想将其替换为:

<ul>
  <li>list item 1</li>
  <li>list item 2</li>
</ul>

我无法绕开<ul>s <li>! 有人可以帮忙吗?

编辑:解决方案如下...

我的代码现在是:

$text = preg_replace('/\* (.*?)\n/', '<ul><li>$1</li></ul>', $text);
$text = preg_replace('/<\/ul><ul>/', '', $text);

做到了!

4

4 回答 4

4

一种选择是简单地替换每个列表项,<ul><li>list item X</li></ul>然后运行第二次替换,这将替换任何</ul><ul>内容。

于 2009-08-09T22:33:29.090 回答
2

我知道这是一个旧帖子 - 但它需要一个解决方案。试试这个!:)

$text = preg_replace("/\[ul\](.*)\[\/ul\]/Usi", "<ul>\\1</ul>", $text);
$text = preg_replace("/\[li\](.*)\[\/li\]/Usi", "<li>\\1</li>", $text);
于 2012-09-26T03:18:36.513 回答
0

我不是正则表达式的专家,但是您要做的是匹配您拥有的模式,并通过用 () 包围所需的模式将其捕获到反向引用中。然后,您可以将 $1 (用于第一个反向引用等)放在“很棒的代码部分”中

如果您需要更多, Regex buddy有一个非常非常棒的正则表达式教程

于 2009-08-09T22:29:29.630 回答
0

我想这就是你想要的

<?php

$text = <<<TEXT
* item
* item
TEXT;

$html = preg_replace( "/^\\* (.*)$/m", "<li>\\1</li>", $text );

echo '<ul>', $html, '</ul>';
于 2009-08-09T22:40:45.130 回答