PHP preg_replace()在多个项目上

时间:2009-08-09 22:25:52

标签: php regex preg-replace

这是我到目前为止所做的:

<?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>并绕过<li>!有人可以帮忙吗?

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

我的代码现在写着:

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

那就做到了!

5 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

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

$text = preg_replace("/\[ul\](.*)\[\/ul\]/Usi", "<ul>\\1</ul>", $text);
$text = preg_replace("/\[li\](.*)\[\/li\]/Usi", "<li>\\1</li>", $text);

答案 2 :(得分:0)

我不是正则表达式的专家,但你想要做的就是匹配你所拥有的模式,并通过用()的方式包围所需的模式将其捕获到反向引用中。然后,您可以在“令人敬畏的代码部分”

中放置1美元(用于第一个反向引用,依此类推) 如果您需要更多

Regex buddy有一个非常非常棒的正则表达式教程

答案 3 :(得分:0)

您可以使用preg_match_all匹配所有项目,然后在ul和li标签内重写它们。

答案 4 :(得分:0)

我认为这就是你想要的

<?php

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

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

echo '<ul>', $html, '</ul>';