代码之家  ›  专栏  ›  技术社区  ›  Al.

多个项目的php preg_replace()。

  •  2
  • Al.  · 技术社区  · 16 年前

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

    <?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> S!有人能帮忙吗?

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

    我的代码是:

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

    就是这样!

    5 回复  |  直到 16 年前
        1
  •  3
  •   Amber    16 年前

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

        2
  •  2
  •   David    12 年前

    我知道这是一篇老文章,但它需要一个解决方案。试试这个!:)

    $text = preg_replace("/\[ul\](.*)\[\/ul\]/Usi", "<ul>\\1</ul>", $text);
    $text = preg_replace("/\[li\](.*)\[\/li\]/Usi", "<li>\\1</li>", $text);
    
        3
  •  0
  •   Chris Thompson    16 年前

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

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

        4
  •  0
  •   Ahmet Kakıcı    16 年前

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

        5
  •  0
  •   Peter Bailey    16 年前

    我想这就是你想要的

    <?php
    
    $text = <<<TEXT
    * item
    * item
    TEXT;
    
    $html = preg_replace( "/^\\* (.*)$/m", "<li>\\1</li>", $text );
    
    echo '<ul>', $html, '</ul>';