Php Ul标签。如何使用正则表达式标识列表的开始和结束

Php Ul标签。如何使用正则表达式标识列表的开始和结束,php,regex,markdown,Php,Regex,Markdown,我在数据库中有很多不同的博客文章。他们正在降价。我想把它们转换成html。我的ul标签有问题 例如,以一种简化的方式,我有: Something - First - Second Something else Second ul - First - Second Some final text 我可以把li标签贴上: $text = preg_replace("/^- (.*)/m", "<li>$1</li>", $text); $text=preg_replac

我在数据库中有很多不同的博客文章。他们正在降价。我想把它们转换成html。我的ul标签有问题

例如,以一种简化的方式,我有:

Something
- First
- Second
Something else

Second ul
- First
- Second
Some final text
我可以把li标签贴上:

$text = preg_replace("/^- (.*)/m", "<li>$1</li>", $text);
$text=preg_replace(“/^-(.*)/m”,“
  • $1
  • ”,$text);
    但是,我如何识别列表的开头或结尾以放置ul标签

    我想要这个结果:

    Something
    <ul>
    <li>- First</li>
    <li>- Second</li>
    </ul>
    Something else
    
    Second ul
    <ul>
    <li>- First</li>
    <li>- Second</li>
    </ul>
    Some final text
    
    什么
    • -首先
    • -第二
    别的 第二保险商实验室
    • -首先
    • -第二
    一些定稿
    您需要在两次过程中完成此操作,因此使用两次
    preg\u replace
    调用:

    $text = preg_replace("/^- (.*)/m", "<li>$1</li>", 
                preg_replace("/^- .*(\R- .*)*/m", "<ul>\n$0\n</ul>", $text)
            );
    
    $text=preg_replace(“/^-(.*)/m)”,“
  • $1
  • ”, preg_replace(“/^-.*(\R-.*)/m”,“
      \n$0\n
    ”,$text) );
    内部代码首先执行,查找以
    -
    开头的行,并捕获以下也以
    -
    开头的所有行,直到后面的行不以
    -
    开头

    *
    匹配当前行末尾的任何内容。新行字符与
    不匹配。因此,next用于匹配任何被认为是换行符序列的内容。然后再次进行连字符检查,并捕获行的其余部分。这可以尽可能多地重复(
    (…)*

    然后将匹配的块包装在
    ul
    标记中。在此阶段不会删除连字符


    外层将在
    li
    标签中以
    -
    开头的行包裹起来,取出
    -

    请解释一下您的内层。什么是\R?我添加了更多详细信息。我一直在搜索,但找不到任何关于\R这是否像一个包含\n和\R的泛型?我的答案中有一个超链接;-)另请参见。在这里,使用正则表达式可能不是理想的方法。